Django - Modèles

Un modèle est une classe qui représente une table ou une collection dans notre base de données, et où chaque attribut de la classe est un champ de la table ou de la collection. Les modèles sont définis dans le fichier app / models.py (dans notre exemple: myapp / models.py)

Créer un modèle

Voici un modèle Dreamreal créé à titre d'exemple -

from django.db import models

class Dreamreal(models.Model):

   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "dreamreal"

Chaque modèle hérite de django.db.models.Model.

Notre classe a 4 attributs (3 CharField et 1 Integer), ce seront les champs de la table.

La classe Meta avec l'attribut db_table nous permet de définir le nom réel de la table ou de la collection. Django nomme automatiquement la table ou la collection: myapp_modelName. Cette classe vous permettra de forcer le nom de la table à ce que vous aimez.

Il y a plus de type de champ dans django.db.models, vous pouvez en savoir plus sur eux sur https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Après avoir créé votre modèle, vous aurez besoin de Django pour générer la base de données réelle -

$python manage.py syncdb

Manipulation des données (CRUD)

Créons une vue "crudops" pour voir comment nous pouvons effectuer des opérations CRUD sur des modèles. Notre myapp / views.py ressemblera alors à -

myapp/views.py

from myapp.models import Dreamreal
from django.http import HttpResponse

def crudops(request):
   #Creating an entry
   
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "[email protected]", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   
   #Read ALL entries
   objects = Dreamreal.objects.all()
   res ='Printing all Dreamreal entries in the DB : <br>'
   
   for elt in objects:
      res += elt.name+"<br>"
   
   #Read a specific entry:
   sorex = Dreamreal.objects.get(name = "sorex")
   res += 'Printing One entry <br>'
   res += sorex.name
   
   #Delete an entry
   res += '<br> Deleting an entry <br>'
   sorex.delete()
   
   #Update
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "[email protected]", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   res += 'Updating entry<br>'
   
   dreamreal = Dreamreal.objects.get(name = 'sorex')
   dreamreal.name = 'thierry'
   dreamreal.save()
   
   return HttpResponse(res)

Autre manipulation de données

Explorons d'autres manipulations que nous pouvons faire sur les modèles. Notez que les opérations CRUD ont été effectuées sur des instances de notre modèle, maintenant nous allons travailler directement avec la classe représentant notre modèle.

Créons une vue 'datamanipulation' dans myapp/views.py

from myapp.models import Dreamreal
from django.http import HttpResponse

def datamanipulation(request):
   res = ''
   
   #Filtering data:
   qs = Dreamreal.objects.filter(name = "paul")
   res += "Found : %s results<br>"%len(qs)
   
   #Ordering results
   qs = Dreamreal.objects.order_by("name")
   
   for elt in qs:
      res += elt.name + '<br>'
   
   return HttpResponse(res)

Lier des modèles

Django ORM propose 3 façons de lier des modèles -

L'un des premiers cas que nous verrons ici est celui des relations un-à-plusieurs. Comme vous pouvez le voir dans l'exemple ci-dessus, la société Dreamreal peut avoir plusieurs sites Web en ligne. La définition de cette relation se fait à l'aide de django.db.models.ForeignKey -

myapp/models.py

from django.db import models

class Dreamreal(models.Model):
   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()
   online = models.ForeignKey('Online', default = 1)
   
   class Meta:
      db_table = "dreamreal"

class Online(models.Model):
      domain = models.CharField(max_length = 30)
   
   class Meta:
      db_table = "online"

Comme vous pouvez le voir dans notre mise à jour myapp / models.py, nous avons ajouté le modèle en ligne et l'avons lié à notre modèle Dreamreal.

Voyons comment tout cela fonctionne via le shell manage.py -

Commençons par créer des sociétés (entrées Dreamreal) pour les tests dans notre shell Django -

$python manage.py shell

>>> from myapp.models import Dreamreal, Online
>>> dr1 = Dreamreal()
>>> dr1.website = 'company1.com'
>>> dr1.name = 'company1'
>>> dr1.mail = '[email protected]'
>>> dr1.phonenumber = '12345'
>>> dr1.save()
>>> dr2 = Dreamreal()
>>> dr1.website = 'company2.com'
>>> dr2.website = 'company2.com'
>>> dr2.name = 'company2'
>>> dr2.mail = '[email protected]'
>>> dr2.phonenumber = '56789'
>>> dr2.save()

Maintenant quelques domaines hébergés -

>>> on1 = Online()
>>> on1.company = dr1
>>> on1.domain = "site1.com"
>>> on2 = Online()
>>> on2.company = dr1
>>> on2.domain = "site2.com"
>>> on3 = Online()
>>> on3.domain = "site3.com"
>>> dr2 = Dreamreal.objects.all()[2]
>>> on3.company = dr2
>>> on1.save()
>>> on2.save()
>>> on3.save()

L'accès à l'attribut de la société d'hébergement (entrée Dreamreal) à partir d'un domaine en ligne est simple -

>>> on1.company.name

Et si nous voulons connaître tout le domaine en ligne hébergé par une entreprise dans Dreamreal, nous utiliserons le code -

>>> dr1.online_set.all()

Pour obtenir un QuerySet, notez que toutes les méthodes de manipulation que nous avons vues auparavant (filter, all, exclude, order_by ....)

Vous pouvez également accéder aux attributs de modèle liés pour les opérations de filtrage, disons que vous souhaitez obtenir tous les domaines en ligne où le nom Dreamreal contient `` société '' -

>>> Online.objects.filter(company__name__contains = 'company'

Note- Ce type de requête est uniquement pris en charge pour SQL DB. Cela ne fonctionnera pas pour les bases de données non relationnelles où les jointures n'existent pas et il y a deux '_'.

Mais ce n'est pas le seul moyen de lier des modèles, vous disposez également de OneToOneField, un lien qui garantit que la relation entre deux objets est unique. Si nous avons utilisé OneToOneField dans notre exemple ci-dessus, cela signifierait que pour chaque entrée Dreamreal, une seule entrée en ligne est possible et dans l'autre sens.

Et le dernier, la relation ManyToManyField pour (nn) entre les tables. Notez que ceux-ci sont pertinents pour les bases de données SQL.