Dedičnosť vám umožňuje opätovne použiť kód a vytvárať čistejšie dátové modely. Ale Django ponúka viac ako jeden spôsob dedenia, takže sa uistite, že poznáte rozdiely.

Dedičnosť modelu je funkcia Django ORM, ktorá umožňuje vývojárom vytvárať hierarchické vzťahy medzi databázovými modelmi. Umožňuje opätovné použitie kódu, rozšíriteľnosť a čistejšiu základňu kódu využívaním princípov objektovo orientovaného programovania.

Či už vytvárate komplexnú webovú aplikáciu alebo pracujete na menšom projekte, dedičnosť modelu môže ponúknuť významné výhody, ako je zníženie redundancie a zabezpečenie konzistentného správania.

Typy modelovej dedičnosti v Django

Django ponúka podporu pre tri typy dedenia modelu:

  1. Abstraktné základné triedy.
  2. Dedičnosť viacerých tabuliek.
  3. Modely proxy.

Každý z týchto typov dedenia modelu má výhody a budete ich používať na špecifické účely.

Abstraktné základné triedy

Abstraktné základné triedy poskytujú spôsob, ako definovať spoločné polia a metódy, ktoré môže zdediť viacero modelov. Napríklad, ak máte dva modely zdieľajúce podobné polia, môžete použiť abstraktnú základnú triedu na definovanie podobných polí. Pozrite si tento príklad:

instagram viewer

triedaZákazník(modely. Model):
meno = modely. CharField (max_length=50)
email = modely. EmailField()
customer_id = modely. IntegerField()

triedaPredávajúci(modely. Model):
meno = modely. CharField (max_length=50)
email = modely. EmailField()
seller_id = modely. IntegerField()

Útržok kódu vyššie definuje dva modely Django: Zákazník a Predávajúci. Tieto modely zdieľajú dve spoločné oblasti, a to názov a email. Aby ste predišli tejto redundancii, môžete vytvoriť samostatný model na uchovávanie spoločných polí v Zákazník a Predávajúci modely a urobte to abstraktné.

triedaUserInfo(modely. Model):
meno = modely. CharField (max_length=50)
email = modely. EmailField()

triedaMeta:
abstraktné = Pravda

Vyššie uvedený útržok kódu definuje nový model a nastavuje abstraktné pripisovať Pravda. To znamená, že model bude abstraktný a Django nevytvorí tabuľku v databáze.

Môžete prepísať Zákazník a Predávajúci modely ako tento:

triedaZákazník(UserInfo):
customer_id = modely. IntegerField()

triedaPredávajúci(UserInfo):
seller_id = modely. IntegerField()

Vo vyššie uvedenom útržku kódu je Zákazník a Predajcovia modely dedia z UserInfo model namiesto toho modelov. Model.

Svoje modely si môžete zobraziť na paneli správcu tak, že ich zaregistrujete vo svojom admin.py súbor takto:

od .modelky importovať Zákazník, Predajca

admin.site.register (zákazník)
admin.site.register (Predávajúci)

Migrujte svoje režimy a spustite vývojový server spustením nasledujúceho na a príkazový riadok:

python manage.py makemigrations \
&& python manage.py migrovať \
&& python manage.py runserver

Prejdite na svoju stránku správcu a prihláste sa pomocou podrobností o svojom superpoužívateľovi. Mali by ste vidieť všetky tri polia pre každý model.

V tomto príklade Django vytvoril tabuľku pre Zákazník a Predávajúci modelov. Môžete vidieť, že UserInfo model nemá tabuľku, pretože je abstraktný.

Dedičnosť viacerých tabuliek

Dedičnosť viacerých tabuliek môžete použiť, keď rodičovský model musí existovať aj ako tabuľka v databáze spolu s podriadeným modelom.

Na rozdiel od abstraktnej dedičnosti základnej triedy, kde nadradený model nebude tabuľka v databáze, dedičnosť viacerých tabuliek vytvorí tabuľku pre nadradený model.

Pri dedení viacerých tabuliek podriadený model zdedí všetky polia a metódy zo svojho nadradeného modelu a pridáva svoje špecifické polia. Cudzie kľúče pomôcť založiť modelový vzťah medzi modelmi rodičov a detí.

Tu je príklad dedičnosti viacerých tabuliek:

triedaOsoba(modely. Model):
krstné_meno = modelky. CharField (max_length=100)
priezvisko = modelky. CharField (max_length=100)

defget_name(ja):
vrátiťf"{self.first_name}{self.last_name}"

triedaMeta:
abstraktné = Pravda

triedazamestnanec(osoba):
zamestnanec_id = modely. CharField (max_length=20)
oddelenie = modely. CharField (max_length=100)
plat = modelky. FloatField()
dob = modely. DateField()

triedamanažér(zamestnanec):
titul = modely. CharField (max_length=100)

Tento útržok kódu definuje tri modely. Prvý model, tzv Osoba, je abstraktný. Definuje iba meno a priezvisko osoby.

Druhý model, tzv zamestnanec, zdedí polia z Osoba ale definuje ďalšie polia. The zamestnanec model nie je abstraktný, preto bude mať svoju tabuľku v databáze.

Finálny model, tzv manažér, zdedí polia zamestnanec model a pridá pole tzv titul.

Vzťah medzi zamestnanec a manažér modely sa nazývajú Dedičnosť viacerých tabuliek. Migrujte svoje modely, zaregistrujte ich admin.py, spustite server a prejdite na panel správcu. Mali by ste vidieť dve tabuľky vytvorené Djangom.

Keď sa pokúsite pridať nového manažéra, všimnete si, že má všetky polia z zamestnanec model, ako aj vlastné vlastné pole.

Modely proxy

Model proxy vám pomáha vytvoriť nový model, ktorý sa rozširuje z existujúceho modelu bez vytvorenia novej databázovej tabuľky. Pri tomto druhu dedenia modelu budú proxy a pôvodné modely zdieľať rovnakú tabuľku. Pomocou modelov proxy môžete robiť veci, ako je vytváranie vlastných modelov a zmena predvolených manažérov.

Model proxy môžete vytvoriť pridaním proxy=Pravda v Meta trieda. Tu je príklad:

triedaProxyModel(Základný model):

triedaMeta:
proxy = Pravda

Typické použitie proxy modelu je vhodné, keď existuje základný model a je potrebné vytvoriť jeho špecializovanú verziu s pridanou funkcionalitou. Tu je základný príklad:

triedaPríspevok(modely. Model):
titul = modely. CharField (max_length=30)
autor = modely. CharField (max_length=30)

def__str__(ja):
vrátiť vlastný.titul

triedaProxyPost(príspevok):

triedaMeta:
proxy = Pravda

Tento útržok kódu definuje dva modely: Príspevok a MyPost. The Príspevok model definuje dve polia pre názov a autora. The ProxyPost model dedí z Príspevok Model.

Migrujte vyššie uvedené modely a pridajte nový príspevok do tabuľky vytvorenej pre Príspevok Model.

Po pridaní príspevku otvorte Príspevky proxy tabuľky. Mali by ste nájsť príspevok, ktorý ste pridali Príspevok stôl v ňom.

Zmeny, ktoré vykonáte v príspevkoch v Príspevky proxy tabuľka ovplyvní príslušný príspevok v Príspevok stôl a naopak. To dokazuje, že skutočne zdieľajú rovnaký stôl.

Môžete upraviť str() metóda proxy modelu:

triedaProxyPost(príspevok):

triedaMeta:
proxy = Pravda
objednávka = ["titul"]

def__str__(ja):
vrátiť seba.autor

Touto úpravou sa a ProxyPost zastúpenie reťazca bude jeho autorom, nie názvom. Zoradenie modelu proxy bude tiež podľa názvu namiesto predvoleného poľa ID.

Pri používaní modelov proxy by ste mali mať na pamäti, že do modelu proxy nemôžete pridávať vlastné polia. Primárny prípad použitia proxy modelov je, keď chcete, aby jeden model podporoval viacero správaní.

Proxy modely vám pomôžu zmeniť správanie existujúceho modelu bez úpravy jeho polí alebo základnej štruktúry databázovej tabuľky.

Použite dedičnosť modelu pre opätovnú použiteľnosť kódu a organizačnú štruktúru

Využitím rôznych techník dedičnosti modelu môžete ľahko vytvoriť opakovane použiteľný a organizovaný kód pre svoj projekt.

Dedičnosť modelu zabraňuje nadbytočnému kódu a zlepšuje udržiavateľnosť a škálovateľnosť vášho kódu. Tiež uľahčuje navigáciu v kóde, čím podporuje efektívnu spoluprácu medzi vývojovými tímami.

Okrem dedičnosti modelov ponúka Django aj dedičnosť šablón, čo je skvelý spôsob, ako spravovať a organizovať šablóny pre vaše projekty.