Django-modellek
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 Category
ké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
null
szeretné állítani, állítsa a következőreNone
default
: .
unique
- Ennek a mezőnek egyedi értéket kell tartalmaznia.
- Az alapértelmezett szint a
False
.
min_length
ésmax_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
ésmax_value
- Számtípusokkal a minimális és maximális értékek azonosítására szolgál.
auto_now
ésauto_now_add
.- Dátum-/időtípusokkal jelzi, hogy az aktuális időpontot kell-e használni.
auto_now
A mező mindig az aktuális mentési időpontra lesz állítva, ami a mezők esetébenlast_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ébencreation_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 id
mező 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.PROTECT
hibá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