Django-modellek

Befejeződött

A modellek minden ORM középpontjában állnak. A modell az alkalmazás által használható adatok egy részét ábrázolja. Ez lehet egy személy, egy termék, egy kategória vagy bármilyen más adat, amire az alkalmazásnak szüksége van.

Modell létrehozása

A Django-ban a modell minden olyan osztály, amely a funkciók gyűjteményét örökli.django.models.Model A gyűjtemény olyan metódusokat tartalmaz, amelyekkel lekérdezheti az adatbázist, új bejegyzéseket hozhat létre és frissítéseket menthet. Mezőket is definiálhat, metaadatokat állíthat be, és kapcsolatokat hozhat létre a modellek között.

Ha két modellt szeretne létrehozni, Product és Categorykét osztályt szeretne hozzáadni:

from django.db import models
class Product(models.Model):
    # details would go here
    pass

class Category(models.Model):
    # details would go here
    pass

Metódusok hozzáadása

Mielőtt bemutatnánk, hogyan konfigurálhatja a modell adatait, fontos kiemelni, hogy a modell Egy Python-osztály. Ennek eredményeképpen egyszerre adhat hozzá metódusokat, és felülbírálhatja azokat, amelyek Django.models.Model biztosítják, vagy azokat, amelyek az összes Python-objektumhoz tartoznak.

Az egyik módszer különösen a kiemelés.__str__ Ezzel a módszerrel megjeleníthet egy objektumot, ha nincs megadva mező. Ha Product van egy name mezője (amelyet egy pillanat alatt láthatunk), akkor felül kell bírálni az alapértelmezett sztring-ábrázolást Product__str__.

class Product(models.Model):
    name = models.TextField()
    
    def __str__(self):
        return self.name

Mezők hozzáadása

A mezők határozzák meg a modell adatstruktúráját. A mezők tartalmazhatják egy elem nevét, a létrehozás dátumát, az árat vagy bármely más adatot, amelyet a modellnek tárolnia kell.

A különböző adattípusok különböző adattípusokkal, érvényesítési szabályokkal és más metaadatokkal rendelkeznek. A Django ORM számos lehetőséget tartalmaz a modellek mezőinek a specifikációkhoz való konfigurálásához. Az ORM bővíthető, így szükség szerint saját szabályokat hozhat létre.

A mezőtípus meghatározása

Az összes mező metaadatainak alapvető része az az adattípus, amelyet tárolni fog, például egy sztring vagy egy szám. A mezőtípusok adatbázistípusra és HTML-űrlapvezérlő típusra (például szövegdobozra vagy jelölőnégyzetre) is megfeleltethetők. A Django számos mezőtípust tartalmaz, többek között a következőket:

  • CharField: Egyetlen sornyi szöveg.
  • TextField: Több sornyi szöveg.
  • BooleanField: Logikai igaz/hamis beállítás.
  • DateField: Dátum.
  • TimeField: Egy idő.
  • DateTimeField: Dátum és idő.
  • URLField: URL-cím.
  • IntegerField: Egész szám.
  • DecimalField: Rögzített pontosságú decimális szám.

Ha mezőket szeretne hozzáadni az osztályainkhoz Product , Category a következő kóddal rendelkezhet:

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()

Mezőbeállítások

A mezőbeállítások használatával metaadatokat adhat hozzá a null vagy üres értékek engedélyezéséhez, vagy egyediként jelölhet meg egy mezőt. Érvényesítési beállításokat is megadhat, és egyéni üzeneteket is megadhat az érvényesítési hibákhoz.

A mezőtípusokhoz hasonlóan a mezőbeállítások is megfeleltetik az adatbázis megfelelő beállításait. A szabályokat minden olyan formában érvényesítjük, amelyet a Django hoz létre az Ön nevében.

A mezőbeállítások a mező függvényébe kerülnek. A különböző mezők különböző beállításokat támogathatnak. A leggyakoribbak a következők:

  • null
    • Logikai beállítás null értékek engedélyezésére.
    • Az alapértelmezett szint a False.
  • blank
    • Logikai beállítás üres értékek engedélyezéséhez.
    • Az alapértelmezett szint a False.
  • default
    • Engedélyezi az alapértelmezett érték konfigurálását, ha nincs megadva érték a mezőhöz.
    • Ha az alapértelmezett értéket egy adatbázisra nullszeretné állítani, állítsa a következőreNonedefault: .
  • unique
    • Ennek a mezőnek egyedi értéket kell tartalmaznia.
    • Az alapértelmezett szint a False.
  • min_length és max_length
    • Sztringtípusokkal a sztringek minimális és maximális hosszának azonosítására szolgál.
    • Az alapértelmezett szint a None.
  • min_value és max_value
    • Számtípusokkal a minimális és maximális értékek azonosítására szolgál.
  • auto_now és auto_now_add.
    • Dátum-/időtípusokkal jelzi, hogy az aktuális időpontot kell-e használni.
    • auto_nowA mező mindig az aktuális mentési időpontra lesz állítva, ami a mezők esetében last_update hasznos.
    • auto_now_add a mezőt a létrehozás aktuális időpontjára állítja be, ami a mezők esetében creation_date hasznos.

Megjegyzés:

Az értékek null hasonlónak blank tűnhetnek, de az adatbázis szempontjából különböző dolgokat jelentenek. null az érték hiánya, míg blank kifejezetten üres érték.

Ha lehetőségeket szeretne hozzáadni modelljeinkhez, a kód a következőképpen nézhet ki:

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)

Kulcsok és kapcsolatok

A relációs adatbázisok általános gyakorlata, hogy egy tábla minden sora rendelkezik elsődleges kulccsal, általában automatikusan növekvő egész számokkal. A Django ORM-je automatikusan hozzáadja ezt a kulcsot minden létrehozott modellhez egy névvel ellátott idmező hozzáadásával.

Ha felül szeretné bírálni ezt a viselkedést, beállíthatja azt a mezőt, amelyet elsődleges kulcsként szeretne használni. Azonban a legtöbb helyzetben Django mezőnyére id kell támaszkodnia.

A relációs adatbázisok táblák között is vannak kapcsolatok. Egy termék kategóriával rendelkezik, az alkalmazottnak menedzsere van, az autónak pedig gyártója. A Django ORM-je minden olyan kapcsolatot támogat, amelyet a modellek között létre szeretne hozni.

A leggyakoribb kapcsolat az "egy-a-többhöz", amelyet technikailag idegenkulcs-kapcsolatnak neveznek. Egy idegenkulcs-kapcsolatban több elem egyetlen attribútummal rendelkezik. Több termék például egyetlen kategóriába van csoportosítva. A kapcsolat modellezéséhez használja a ForeignKey mezőt.

A kapcsolat létrehozásához adja hozzá a mezőt a ForeignKey gyermekobjektumhoz. Ha a termékek kategóriákba vannak csoportosítva, akkor hozzáadja a category tulajdonságot az Product osztályhoz, és a típust úgy állítja be, hogy az legyen ForeignKey.

Django automatikusan hozzáad egy tulajdonságot a szülőhöz, hogy hozzáférést biztosítson az összes gyermekhez <child>_set, ahol <child> a gyermekobjektum neve szerepel. A példánkban automatikusan hozzáadjukproduct_set, Category hogy hozzáférést biztosítsunk a kategória összes termékéhez.

ForeignKey van egy kötelező paraméter, on_delete. Ez a paraméter tájékoztatja Django-t, hogy mi a teendő, ha a szülő törlődik. Vagyis ha törölünk egy kategóriát, mi történjen az adott kategóriában szereplő termékeivel?

A két leggyakoribb lehetőség a következő:

  • CASCADE, amely törli az összes terméket, ha egy kategóriát töröl a példánkban.
  • PROTECThibát ad vissza, ha egy termékeket tartalmazó kategóriát próbálunk törölni.

Megjegyzés:

A legtöbb esetben érdemes használni PROTECT.

Ha frissíteni szeretné a modellt a kapcsolat létrehozásához, a következő kódot használhatjuk:

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