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.