Modellen in Django

Voltooid

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 Categoryu 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 in default op None.
  • unique
    • Dit veld moet een unieke waarde bevatten.
    • Standaard is False.
  • min_length en max_length
    • Wordt gebruikt met tekenreekstypen om de minimale en maximale tekenreekslengte te identificeren.
    • Standaard is None.
  • min_value en max_value
    • Wordt gebruikt met getaltypen om de minimum- en maximumwaarden te identificeren.
  • auto_now en auto_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 voor last_update velden.
    • auto_now_add stelt het veld in op de huidige tijd voor het maken, wat handig is voor creation_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 idtoe 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