English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

模型(Model)Django

Un modèle est une classe représentant notre table ou ensemble de base de données, et chaque attribut de la classe est un champ de la table ou de l'ensemble. Les modèles sont dans l'app/défini dans models.py (dans notre exemple, c'est : myapp/models.py)

Créer un modèle

Voici la création d'une instance de modèle Dreamreal −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
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 a4un attribut (3 CharField et1un entier), cela sera le champ de la table.

La classe Meta et l'attribut db_table nous permettent de définir le nom réel de la table ou de l'ensemble. Django nomme automatiquement les tables ou les ensembles : myapp_modelName. Cette classe force le nom de la table.

Dans django.db.models, vous pouvez en savoir plus sur les types de champs via leur URL :

https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Après avoir créé le modèle, Django doit générer la base de données réelle −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
$python manage.py syncdb

Opérations de données (CRUD)

Créons une vue 'crudops' pour voir comment nous pouvons effectuer des opérations CRUD sur le modèle. Maintenant myapp/views.py puis quelque chose qui ressemble à −

myapp/views.py

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def crudops(request):
    #Créer une entrée
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "00"2376970"
    )
    dreamreal.save()
    #Lire TOUS les entrées
    objects = Dreamreal.objects.all()
    res = 'Imprimer toutes les entrées Dreamreal dans la base de données : <br>'
    for elt in objects:
       res +elt.name+"<br>"
    #Lire une entrée spécifique:
    sorex = Dreamreal.objects.get(name = "sorex")
    res += 'Imprimer une entrée<br>'
    res += sorex.name
    #Supprimer une entrée
    res += '<br>Suppression d'une entrée<br>'
    sorex.delete()
    #Mise à jour
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "00"2376970"
    )
    dreamreal.save()
    res += 'Mise à jour d'une entrée<br>'
    dreamreal = Dreamreal.objects.get(name = 'sorex')
    dreamreal.name = 'thierry'
    dreamreal.save()
    return HttpResponse(res)

Autres opérations de données

Explorons d'autres opérations possibles sur le modèle. Il convient de noter que les opérations CRUD sont effectuées sur des instances du modèle, et nous allons directement illustrer le fonctionnement de la classe du modèle.

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def datamanipulation(request):
    res = ""
    #Filtrage des données:
    qs = Dreamreal.objects.filter(name = "paul")
    res +qs = "Trouvé : %s résultats<br>%" % len(qs)
    #Triant les résultats
    qs = Dreamreal.objects.order_by("name")
    for elt in qs:
       res +elt.name + '<br>'
    return HttpResponse(res)

lier les modèles

Django ORM fournit3Cette manière de lier les modèles −

Le premier exemple que nous verrons ici sera une relation un à plusieurs. Comme vous pouvez le voir dans l'exemple ci-dessus, une entreprise peut avoir plusieurs sites en ligne. Cette relation est définie en utilisant django.db.models.ForeignKey pour lier les modèles − -

myapp/models.py

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
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"

Il est possible de mettre à jour myapp/models.py, comme vous le voyez, nous avons ajouté un modèle en ligne et lié au modèle Dreamreal.

Voyons comment exécuter toutes les tâches avec le shell manage.py −

Permettons-nous d'abord de tester la création de quelques entreprises (éléments Dreamreal) avec le shell Django −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
$python manage.py shell
 >>> from myapp.models import Dreamreal, Online
 >>> dr1 = Dreamreal()
 >>> dr1.website = 'company1.com'
 >>> dr1.name = 'company1'
 >>> dr1.mail = 'contact@company1'
 >>> dr1.phonenumber = '12345'
 >>> dr1.save()
 >>> dr2 = Dreamreal()
 >>> dr1.website = 'company2.com'
 >>> dr2.website = 'company2.com'
 >>> dr2.name = 'company2'
 >>> dr2.mail = 'contact@company2'
 >>> dr2.phonenumber = '56789'
 >>> dr2.save()

Il y a maintenant quelques domaines de gestion de proxy −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
>>> 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()

从在线域访问托管公司(Dreamreal项)的属性是很简单的 -

 # Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
>>> on1.company.name

如果想知道公司Dreamreal主办的所有网上域名,我们将使用代码 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
>>> dr1.online_set.all()

为了得到一个QuerySet,请注意,所有的操作方法,我们以前见过(filter, all, exclude, order_by....)

也可以访问进行过滤操作链接模型属性,比如说,想获得的所有在线域所在Dreamreal名称包含“company”-

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : fr.oldtoolbag.com
# Date : 2020-08-08
>>> Online.objects.filter(company__name__contains='company')

注 - 那种查询只支持SQL数据库。它不会对非关系数据库工作,其中连接不存在,并有两个“_”。

但是,这不是链接模型的唯一方法,也有OneToOneField,这保证了两个对象之间的关系是唯一的链接关系。如果使用了OneToOneField在上面的实例中,这将意味着只有一个在线条目对应于每个Dreamreal条目。

最后,ManyToManyField 表之间(NN)的关系这些都是基于SQL的数据库。