Django - Modelli
Un modello è una classe che rappresenta la tabella o la raccolta nel nostro DB e dove ogni attributo della classe è un campo della tabella o della raccolta. I modelli sono definiti nell'app / models.py (nel nostro esempio: miaapp / modelli.py)
Creazione di un modello
Di seguito è riportato un modello Dreamreal creato come esempio:
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 CharField e 1 Integer), quelli saranno i campi della tabella.
La classe Meta con l'attributo db_table ci consente di definire il nome effettivo della tabella o della raccolta. Django nomina automaticamente la tabella o la raccolta: myapp_modelName. Questa classe ti permetterà di forzare il nome della tabella a quello che ti piace.
C'è più tipo di campo in django.db.models, puoi saperne di più su di loro https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types
Dopo aver creato il tuo modello, avrai bisogno di Django per generare il database effettivo -
$python manage.py syncdb
Manipolazione dei dati (CRUD)
Creiamo una vista "crudops" per vedere come possiamo eseguire operazioni CRUD sui modelli. Il nostro myapp / views.py apparirà quindi come:
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)
Altre manipolazioni dei dati
Esploriamo altre manipolazioni che possiamo fare sui modelli. Nota che le operazioni CRUD sono state eseguite su istanze del nostro modello, ora lavoreremo direttamente con la classe che rappresenta il nostro modello.
Creiamo una vista "manipolazione dati" in 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)
Collegamento di modelli
Django ORM offre 3 modi per collegare i modelli:
Uno dei primi casi che vedremo qui è il rapporto uno-a-molti. Come puoi vedere nell'esempio sopra, la società Dreamreal può avere più siti Web online. La definizione di tale relazione viene eseguita utilizzando 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"
Come puoi vedere nel nostro myapp / models.py aggiornato, abbiamo aggiunto il modello online e lo abbiamo collegato al nostro modello Dreamreal.
Controlliamo come funziona tutto questo tramite la shell manage.py -
Per prima cosa creiamo alcune società (voci Dreamreal) per i test nella nostra 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()
Ora alcuni domini ospitati -
>>> 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'accesso all'attributo della società di hosting (voce Dreamreal) da un dominio online è semplice:
>>> on1.company.name
E se vogliamo conoscere tutto il dominio online ospitato da un'azienda in Dreamreal useremo il codice -
>>> dr1.online_set.all()
Per ottenere un QuerySet, nota che tutti i metodi di manipolazione che abbiamo visto prima (filter, all, exclude, order_by ....)
Puoi anche accedere agli attributi del modello collegato per le operazioni di filtraggio, supponiamo che tu voglia ottenere tutti i domini online in cui il nome Dreamreal contiene "azienda" -
>>> Online.objects.filter(company__name__contains = 'company'
Note- Questo tipo di query è supportato solo per SQL DB. Non funzionerà per DB non relazionali in cui i join non esistono e sono presenti due "_".
Ma non è l'unico modo per collegare i modelli, hai anche OneToOneField, un collegamento che garantisce che la relazione tra due oggetti sia unica. Se usassimo OneToOneField nel nostro esempio sopra, ciò significherebbe per ogni voce Dreamreal è possibile solo una voce online e nell'altro modo.
E l'ultimo, la relazione ManyToManyField per (nn) tra le tabelle. Nota, quelli sono rilevanti per il database basato su SQL.