Dědičnost vám umožňuje znovu používat kód a vytvářet čistší datové modely. Ale Django nabízí více než jeden způsob, jak dědit, takže se ujistěte, že znáte rozdíly.
Dědičnost modelu je funkce Django ORM, která umožňuje vývojářům vytvářet hierarchické vztahy mezi databázovými modely. Umožňuje opětovné použití kódu, rozšiřitelnost a čistší kódovou základnu využitím principů objektově orientovaného programování.
Ať už vytváříte složitou webovou aplikaci nebo pracujete na menším projektu, dědičnost modelu může nabídnout významné výhody, jako je snížení redundance a zajištění konzistentního chování.
Typy modelové dědičnosti v Django
Django nabízí podporu pro tři typy dědičnosti modelu:
- Abstraktní základní třídy.
- Vícetabulková dědičnost.
- Modely proxy.
Každý z těchto typů dědičnosti modelu má výhody a budete je používat pro specifické účely.
Abstraktní základní třídy
Abstraktní základní třídy poskytují způsob, jak definovat společná pole a metody, které může zdědit více modelů. Pokud máte například dva modely sdílející podobná pole, můžete k definování podobných polí použít abstraktní základní třídu. Podívejte se na tento příklad:
třídaZákazník(modely. Modelka):
jméno = modely. CharField (max_length=50)
email = modely. EmailField()
customer_id = modely. IntegerField()
třídaProdejce(modely. Modelka):
jméno = modely. CharField (max_length=50)
email = modely. EmailField()
prodejce_id = modely. IntegerField()
Výše uvedený fragment kódu definuje dva modely Django: Zákazník a Prodejce. Tyto modely sdílejí dvě společné oblasti, a to název a e-mailem. Chcete-li zabránit této nadbytečnosti, můžete vytvořit samostatný model, který bude obsahovat společná pole v Zákazník a Prodejce modely a učinit to abstraktní.
třídaUživatelské informace(modely. Modelka):
jméno = modely. CharField (max_length=50)
email = modely. EmailField()
třídaMeta:
abstraktní = Skutečný
Výše uvedený fragment kódu definuje nový model a nastavuje abstraktní přisuzovat Skutečný. To znamená, že model bude abstraktní a Django nevytvoří tabulku v databázi.
Můžete přepsat Zákazník a Prodejce modely jako tento:
třídaZákazník(Uživatelské informace):
customer_id = modely. IntegerField()
třídaProdejce(Uživatelské informace):
prodejce_id = modely. IntegerField()
Ve výše uvedeném fragmentu kódu je Zákazník a Prodejci modely dědí od Uživatelské informace model místo toho modely. Modelka.
Své modely můžete zobrazit na panelu administrátora tak, že je zaregistrujete ve svém admin.py soubor takto:
z .modely import Zákazník, Prodávající
admin.site.register (zákazník)
admin.site.register (prodejce)
Migrujte své režimy a spusťte svůj vývojový server spuštěním následujícího na a příkazový řádek:
python manage.py makemigrations \
&& python manage.py migrovat \
&& python manage.py runserver
Přejděte na svůj web správce a přihlaste se pomocí údajů o superuživateli. Měli byste vidět všechna tři pole pro každý model.
V tomto příkladu Django vytvořil tabulku pro Zákazník a Prodejce modely. Můžete vidět, že Uživatelské informace model nemá žádnou tabulku, protože je abstraktní.
Vícetabulková dědičnost
Dědičnost více tabulek můžete použít, když nadřazený model také potřebuje existovat jako tabulka v databázi vedle podřízeného modelu.
Na rozdíl od abstraktní dědičnosti základní třídy, kde nadřazeným modelem nebude tabulka v databázi, vícetabulková dědičnost vytvoří tabulku pro nadřazený model.
Při dědění více tabulek podřízený model zdědí všechna pole a metody ze svého nadřazeného modelu a přidá svá specifická pole. Cizí klíče pomoci založit modelový vztah mezi rodičovskými a dětskými modely.
Zde je příklad vícetabulkového dědění:
třídaOsoba(modely. Modelka):
křestní_jméno = modely. CharField (max_length=100)
last_name = modely. CharField (max_length=100)defget_name(já):
vrátit seF"{self.first_name}{self.last_name}"třídaMeta:
abstraktní = SkutečnýtřídaZaměstnanec(Osoba):
zaměstnanec_id = modely. CharField (max_length=20)
oddělení = modely. CharField (max_length=100)
plat = modelky. FloatField()
dob = modely. DateField()
třídaManažer(Zaměstnanec):
titul = modely. CharField (max_length=100)
Tento fragment kódu definuje tři modely. První model, tzv Osoba, je abstraktní. Definuje pouze jméno a příjmení osoby.
Druhý model, tzv Zaměstnanec, zdědí pole Osoba ale definuje další pole. The Zaměstnanec model není abstraktní, takže bude mít svou tabulku v databázi.
Finální model, tzv Manažer, zdědí pole Zaměstnanec model a přidá pole tzv titul.
Vztah mezi Zaměstnanec a Manažer se nazývá modely Vícetabulková dědičnost. Migrujte své modely, zaregistrujte je admin.py, spusťte server a přejděte na panel správce. Měli byste vidět dvě tabulky vytvořené Django.
Když se pokusíte přidat nového správce, všimnete si, že má všechna pole z Zaměstnanec model i vlastní vlastní pole.
Modely proxy
Model proxy vám pomůže vytvořit nový model, který se rozšiřuje ze stávajícího modelu, aniž by bylo nutné vytvářet novou databázovou tabulku. V tomto druhu dědění modelu budou proxy a původní modely sdílet stejnou tabulku. Pomocí modelů proxy můžete dělat věci, jako je vytváření vlastních modelů a změna výchozích správců.
Můžete vytvořit proxy model přidáním proxy=Pravda v Meta třída. Zde je příklad:
třídaProxyModel(Základní model):
třídaMeta:
proxy = Skutečný
Typické použití proxy modelu je vhodné, když existuje základní model a je potřeba vytvořit jeho specializovanou verzi s přidanou funkčností. Zde je základní příklad:
třídaPošta(modely. Modelka):
titul = modely. CharField (max_length=30)
autor = modely. CharField (max_length=30)def__str__(já):
vrátit se vlastní.titultřídaProxyPost(Pošta):
třídaMeta:
proxy = Skutečný
Tento fragment kódu definuje dva modely: Pošta a Můj příspěvek. The Pošta model definuje dvě pole pro název a autora. The ProxyPost model dědí od Pošta Modelka.
Migrujte výše uvedené modely a přidejte nový příspěvek do tabulky vytvořené pro Pošta Modelka.
Po přidání příspěvku otevřete Proxy příspěvky stůl. Měli byste najít příspěvek, který jste přidali Pošta stůl v něm.
Změny, které provedete v příspěvcích v Proxy příspěvky tabulka ovlivní odpovídající příspěvek v Pošta stůl a naopak. To dokazuje, že skutečně sdílejí stejný stůl.
Můžete upravit str() metoda modelu proxy:
třídaProxyPost(Pošta):
třídaMeta:
proxy = Skutečný
objednávka = ["titul"]
def__str__(já):
vrátit se sebe.autor
Díky této úpravě a ProxyPost zastoupením řetězce bude jeho autor, nikoli název. Řazení modelu proxy bude také podle názvu namísto výchozího pole ID.
Při používání modelů proxy byste měli mít na paměti, že do modelu proxy nemůžete přidávat vlastní pole. Primárním případem použití proxy modelů je situace, kdy chcete, aby jeden model podporoval více chování.
Proxy modely vám pomohou změnit chování existujícího modelu bez úpravy jeho polí nebo základní struktury databázových tabulek.
Použijte dědičnost modelu pro znovupoužitelnost kódu a organizační strukturu
Využitím různých technik dědičnosti modelu můžete snadno vytvořit znovu použitelný a organizovaný kód pro svůj projekt.
Dědičnost modelu zabraňuje nadbytečnému kódu a zlepšuje udržovatelnost a škálovatelnost vašeho kódu. Usnadňuje také navigaci v kódu, čímž podporuje efektivní spolupráci mezi vývojovými týmy.
Kromě dědění modelu nabízí Django dědění šablon, což je skvělý způsob, jak spravovat a organizovat šablony pro vaše projekty.