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

Modello (Model) di Django

Il modello rappresenta la nostra tabella di database o la classe di raccolta, e ogni attributo della classe è un campo della tabella o della raccolta. Il modello è definito in app/models.py (nel nostro caso: myapp/models.py)

Creare il modello

Di seguito è riportato come creare un'istanza del modello Dreamreal -

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 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"

Ogni modello eredita da django.db.models.Model.

La nostra classe ha 4 attributi (3 CampoCarattere e 1 intero), che saranno i campi della tabella.

La classe Meta e l'attributo db_table ci permettono di definire il nome effettivo della tabella o del set. Django nomina automaticamente la tabella o il set: myapp_modelName. Questa classe forzerà il nome della tabella.}}

Per saperne di più sui tipi di campo in django.db.models, puoi trovare ulteriori informazioni tramite il loro URL:

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

Dopo aver creato il modello, Django deve generare il database reale −

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
$python manage.py syncdb

Operazioni sui dati (CRUD)

Creiamo una vista "crudops" per vedere come possiamo eseguire operazioni CRUD sul modello. Ora myapp/views.py allora apparirà come −

myapp/views.py

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
from myapp.models import Dreamreal
 from django.http import HttpResponse
 def crudops(request):
    #Creazione di un'entrata
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    #Leggi TUTTE le entrature
    objects = Dreamreal.objects.all()
    res = 'Stampando tutte le entrature Dreamreal nella DB: <br>'
    for elt in objects:
       res += elt.name + "<br>"
    #Leggi un'entrata specifica:
    sorex = Dreamreal.objects.get(name = "sorex")
    res += 'Stampando un'entrata<br>'
    res += sorex.name
    #Elimina un'entrata
    res += '<br>Eliminazione di un'entrata<br>'
    sorex.delete()
    #Aggiorna
    dreamreal = Dreamreal(
       website = "www.polo.com", mail = "[email protected]", 
       name = "sorex", phonenumber = "002376970"
    )
    dreamreal.save()
    res += 'Aggiornamento dell'entrata<br>'
    dreamreal = Dreamreal.objects.get(name = 'sorex')
    dreamreal.name = 'thierry'
    dreamreal.save()
    return HttpResponse(res)

其他数据操作

让我们来探讨可以对模型做的其他操作。需要注意的是 CRUD 操作都做对模型的实例,现在我们将直接表示模型类的工作。

让我们创建一个“datamanipulation”视图在 myapp/views.py

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
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)

链接模型

Django ORM提供3种方式来链接模型 −

我们将在这里看到的第一示例是一个一对多的关系。正如在上面的实例中看到的,一个公司可以有多个在线网站。定义这种关系是通过使用 django.db.models.ForeignKey 完成 -

myapp/models.py

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 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"

Puoi aggiornare myapp/models.py, come vedi, abbiamo aggiunto un modello online e lo abbiamo collegato al modello Dreamreal.

Vediamo come eseguire tutto il lavoro tramite il shell manage.py −

Per prima cosa, testiamo la creazione di alcune aziende (item Dreamreal) tramite il shell Django −

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 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()

Ora ci sono alcuni domini di rete −

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 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()

Accedere alle proprietà della società di hosting online (Dreamreal item) è molto semplice −

 # Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
>>> on1.company.name

Se vuoi sapere tutti i domini online ospitati dalla Dreamreal Company, useremo il codice -

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
>>> dr1.online_set.all()

Per ottenere un QuerySet, nota che tutti i metodi di operazione che abbiamo visto prima (filter, all, exclude, order_by...)

Puoi anche accedere per filtrare l'attributo del modello di link, ad esempio, per ottenere tutti i domini online situati nel nome Dreamreal che contengono 'company' -

# Nome del file: example.py
# Copyright: 2020 da w3codebox
# Autore: it.oldtoolbag.com
# Data: 2020-08-08
>>> Online.objects.filter(company__name__contains='company')

Nota - Quella query supporta solo database SQL. Non funziona sui database non relazionali, dove non esiste una connessione e ci sono due '_'.

Ma questo non è l'unico metodo per linkare modelli, esiste anche OneToOneField, che garantisce che la relazione tra due oggetti sia unica. Se si utilizza OneToOneField nell'esempio sopra, significa che c'è una sola voce online corrispondente a ogni voce Dreamreal.

Ultimo, le relazioni tra ManyToManyField (NN) tra tabelle sono basate su database SQL.