Django - Modelle
Ein Modell ist eine Klasse, die eine Tabelle oder Sammlung in unserer Datenbank darstellt und bei der jedes Attribut der Klasse ein Feld der Tabelle oder Sammlung ist. Modelle werden in der app / models.py definiert (in unserem Beispiel: myapp / models.py)
Modell erstellen
Es folgt ein Dreamreal-Modell, das als Beispiel erstellt wurde:
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"
Jedes Modell erbt von django.db.models.Model.
Unsere Klasse hat 4 Attribute (3 CharField und 1 Integer), das sind die Tabellenfelder.
Mit der Meta-Klasse mit dem Attribut db_table können wir den tatsächlichen Tabellen- oder Sammlungsnamen definieren. Django benennt die Tabelle oder Sammlung automatisch: myapp_modelName. Mit dieser Klasse können Sie den Namen der Tabelle nach Ihren Wünschen erzwingen.
In django.db.models gibt es mehr Feldtypen, über die Sie mehr erfahren können https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types
Nach dem Erstellen Ihres Modells benötigen Sie Django, um die eigentliche Datenbank zu generieren.
$python manage.py syncdb
Daten manipulieren (CRUD)
Lassen Sie uns eine "Crudops" -Ansicht erstellen, um zu sehen, wie wir CRUD-Operationen an Modellen ausführen können. Unsere myapp / views.py sieht dann so aus -
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)
Andere Datenmanipulation
Lassen Sie uns andere Manipulationen untersuchen, die wir an Modellen durchführen können. Beachten Sie, dass die CRUD-Operationen für Instanzen unseres Modells durchgeführt wurden. Jetzt arbeiten wir direkt mit der Klasse, die unser Modell darstellt.
Lassen Sie uns eine 'Datamanipulation'-Ansicht in erstellen 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)
Modelle verknüpfen
Django ORM bietet drei Möglichkeiten, Modelle zu verknüpfen:
Einer der ersten Fälle, die wir hier sehen werden, sind die Eins-zu-Viele-Beziehungen. Wie Sie im obigen Beispiel sehen können, kann das Unternehmen Dreamreal mehrere Online-Websites haben. Das Definieren dieser Beziehung erfolgt mithilfe von 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"
Wie Sie in unserer aktualisierten Datei myapp / models.py sehen können, haben wir das Online-Modell hinzugefügt und mit unserem Dreamreal-Modell verknüpft.
Lassen Sie uns überprüfen, wie all dies über die shell.py-Shell funktioniert -
Zuerst erstellen wir einige Firmen (Dreamreal-Einträge) zum Testen in unserer Django-Shell -
$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()
Nun einige gehostete Domains -
>>> 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()
Der Zugriff auf das Attribut des Hosting-Unternehmens (Dreamreal-Eintrag) über eine Online-Domain ist einfach -
>>> on1.company.name
Und wenn wir alle Online-Domains eines Unternehmens in Dreamreal kennenlernen möchten, verwenden wir den Code:
>>> dr1.online_set.all()
Um ein QuerySet zu erhalten, beachten Sie, dass alle zuvor gesehenen Manipulationsmethoden (filter, all, exclude, order_by ....)
Sie können auch auf die verknüpften Modellattribute für Filtervorgänge zugreifen. Angenommen, Sie möchten alle Online-Domains abrufen, in denen der Name Dreamreal "Firma" enthält.
>>> Online.objects.filter(company__name__contains = 'company'
Note- Diese Art von Abfrage wird nur für SQL DB unterstützt. Es funktioniert nicht für nicht relationale DBs, bei denen keine Joins vorhanden sind und zwei '_' vorhanden sind.
Dies ist jedoch nicht die einzige Möglichkeit, Modelle zu verknüpfen. Sie haben auch OneToOneField, eine Verknüpfung, die garantiert, dass die Beziehung zwischen zwei Objekten eindeutig ist. Wenn wir in unserem obigen Beispiel das OneToOneField verwenden würden, würde dies bedeuten, dass für jeden Dreamreal-Eintrag nur ein Online-Eintrag möglich ist und umgekehrt.
Und das letzte, das ManyToManyField für die (nn) Beziehung zwischen Tabellen. Beachten Sie, dass diese für SQL-basierte DB relevant sind.