Modellen in Django
Modellen vormen het hart van elke ORM. Een model is een weergave van een deel van de gegevens waarmee uw toepassing werkt. Dit kan een persoon, een product, een categorie of een andere vorm van gegevens zijn die uw toepassing nodig heeft.
Een model maken
In Django is een model elke klasse die een verzameling functionaliteit over neemt van django.models.Model
. De verzameling bevat methoden waarmee u query's kunt uitvoeren op de database, nieuwe vermeldingen kunt maken en updates kunt opslaan. U kunt ook velden definiëren, metagegevens instellen en relaties tussen modellen tot stand brengen.
Als u twee modellen Product
wilt maken, voegt Category
u twee klassen toe:
from django.db import models
class Product(models.Model):
# details would go here
pass
class Category(models.Model):
# details would go here
pass
Methoden toevoegen
Voordat we bespreken hoe u de gegevens voor uw model configureert, is het belangrijk om te benadrukken dat een model een Python-klasse is. Als gevolg hiervan kunt u zowel methoden toevoegen als de methoden overschrijven die worden geleverd, of de methoden die Django.models.Model
inherent zijn aan alle Python-objecten.
Eén methode in het bijzonder om te markeren is __str__
. U gebruikt deze methode om een object weer te geven als er geen velden zijn opgegeven. Als Product
er een name
veld is (dat we binnen een ogenblik zien), kunt u dit als standaardtekenreeksweergave Product
retourneren door deze te overschrijven __str__
.
class Product(models.Model):
name = models.TextField()
def __str__(self):
return self.name
Velden toevoegen
Velden definiëren de gegevensstructuur van een model. Velden kunnen de naam van een item, een aanmaakdatum, een prijs of andere gegevens bevatten die het model moet opslaan.
Verschillende stukjes gegevens hebben verschillende gegevenstypen, validatieregels en andere vormen van metagegevens. De Django ORM bevat een uitgebreide reeks opties voor het configureren van de velden van uw modellen aan uw specificaties. De ORM is uitbreidbaar, zodat u waar nodig uw eigen regels kunt maken.
Het veldtype definiëren
Het kernonderdeel metagegevens voor alle velden is het type gegevens dat wordt opgeslagen, zoals een tekenreeks of een getal. Veldtypen worden zowel toegewezen aan een databasetype als een HTML-formulierbesturingselementtype (zoals een tekstvak of een selectievakje). Django bevat verschillende veldtypen, waaronder:
CharField
: Één regel tekst.TextField
: meerdere regels tekst.BooleanField
: Een Booleaanse optie waar/onwaar.DateField
: Een datum.TimeField
: Een tijd.DateTimeField
: Een datum en tijd.URLField
: Een URL.IntegerField
: een geheel getal.DecimalField
: Een decimaal getal met vaste precisie.
Als u velden aan onze Product
en Category
klassen wilt toevoegen, hebben we mogelijk de volgende code:
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
class Category(models.Model):
name = models.TextField()
Veldopties
U kunt veldopties gebruiken om metagegevens toe te voegen om null- of lege waarden toe te staan of een veld als uniek te markeren. U kunt ook validatieopties instellen en aangepaste berichten opgeven voor validatiefouten.
Net als bij veldtypen worden veldopties toegewezen aan de juiste instellingen in de database. De regels worden afgedwongen in alle formulieren die Django namens u genereert.
Veldopties worden doorgegeven aan de functie voor het veld zelf. Verschillende velden ondersteunen mogelijk verschillende opties. Enkele van de meest voorkomende zijn:
null
- Booleaanse optie om null-waarden toe te staan.
- Standaard is
False
.
blank
- Booleaanse optie om lege waarden toe te staan.
- Standaard is
False
.
default
- Hiermee staat u de configuratie van een standaardwaarde toe als er geen waarde voor het veld is opgegeven.
- Als u de standaardwaarde wilt instellen op een database
null
, stelt u deze indefault
opNone
.
unique
- Dit veld moet een unieke waarde bevatten.
- Standaard is
False
.
min_length
enmax_length
- Wordt gebruikt met tekenreekstypen om de minimale en maximale tekenreekslengte te identificeren.
- Standaard is
None
.
min_value
enmax_value
- Wordt gebruikt met getaltypen om de minimum- en maximumwaarden te identificeren.
auto_now
enauto_now_add
.- Wordt gebruikt met datum-/tijdtypen om aan te geven of de huidige tijd moet worden gebruikt.
auto_now
stelt het veld altijd in op de huidige tijd bij het opslaan, wat handig is voorlast_update
velden.auto_now_add
stelt het veld in op de huidige tijd voor het maken, wat handig is voorcreation_date
velden.
Notitie
De waarden null
en blank
kunnen vergelijkbaar lijken, maar ze betekenen verschillende dingen in databasetermen. null
is het ontbreken van een waarde, terwijl blank
dit specifiek een lege waarde is.
Als u opties wilt toevoegen aan onze modellen, kan de code er als volgt uitzien:
from django.db import models
class Product(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
price = models.DecimalField(min_value=0.99, max_value=1000)
creation_date = models.DateField(auto_now_add=True)
class Category(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
Sleutels en relaties
Een standaardpraktijk in relationele databases is dat elke rij in een tabel een primaire sleutel heeft, meestal een automatisch verhoogd geheel getal. Django's ORM voegt deze sleutel automatisch toe aan elk model dat u maakt, door een veld met de naam id
toe te voegen.
Als u dit gedrag wilt overschrijven, kunt u het veld instellen dat u als primaire sleutel wilt gebruiken. In de meeste gevallen moet u echter vertrouwen op het veld van id
Django.
Relationele databases hebben ook relaties tussen tabellen. Een product heeft een categorie, een werknemer heeft een manager en een auto heeft een fabrikant. Django's ORM ondersteunt alle relaties die u mogelijk wilt maken tussen uw modellen.
De meest voorkomende relatie is 'een-op-veel', technisch bekend als een refererende-sleutelrelatie. In een refererende-sleutelrelatie delen meerdere items één kenmerk. Meerdere producten worden bijvoorbeeld gegroepeerd in één categorie. Als u deze relatie wilt modelleren, gebruikt u het ForeignKey
veld.
Als u de relatie wilt maken, voegt u het ForeignKey
veld toe aan het onderliggende object. Als uw producten zijn gegroepeerd in categorieën, voegt u de category
eigenschap toe aan de Product
klasse en stelt u het type in op .ForeignKey
Django voegt automatisch een eigenschap toe aan het bovenliggende item om toegang te bieden tot alle kinderen die worden aangeroepen <child>_set
. Dit <child>
is de naam van het onderliggende object. In ons voorbeeld Category
wordt product_set
automatisch toegevoegd om toegang te bieden tot alle producten in de categorie.
ForeignKey
heeft één verplichte parameter, on_delete
. Deze parameter vertelt Django wat u moet doen als het bovenliggende item wordt verwijderd. Als we een categorie verwijderen, wat moet er gebeuren met de producten in die categorie?
De twee meest voorkomende opties zijn:
CASCADE
, waarmee alle producten worden verwijderd als een categorie in ons voorbeeld wordt verwijderd.PROTECT
, die een fout retourneert als we proberen een categorie te verwijderen die producten bevat.
Notitie
In de meeste situaties wilt u het beste gebruiken PROTECT
.
Om ons model bij te werken om de relatie te maken, kunnen we de volgende code gebruiken:
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
category = models.ForeignKey(
'Category', #The name of the model
on_delete=models.PROTECT
)
class Category(models.Model):
name = models.TextField()
# product_set will be automatically created