Mantojums ļauj atkārtoti izmantot kodu un izveidot tīrākus datu modeļus. Taču Django piedāvā vairāk nekā vienu mantošanas veidu, tāpēc pārliecinieties, ka zināt atšķirības.
Modeļa pārmantošana ir Django ORM līdzeklis, kas ļauj izstrādātājiem izveidot hierarhiskas attiecības starp datu bāzes modeļiem. Tas nodrošina koda atkārtotu izmantošanu, paplašināšanu un tīrāku kodu bāzi, izmantojot objektorientētas programmēšanas principus.
Neatkarīgi no tā, vai veidojat sarežģītu tīmekļa lietojumprogrammu vai strādājat pie mazāka projekta, modeļa pārmantošana var sniegt ievērojamas priekšrocības, piemēram, samazināt dublēšanos un nodrošināt konsekventu darbību.
Modeļu mantojuma veidi Django
Django piedāvā atbalstu trīs modeļu mantojuma veidiem:
- Abstraktās bāzes klases.
- Vairāku tabulu mantošana.
- Starpniekserveru modeļi.
Katram no šiem modeļu mantojuma veidiem ir priekšrocības, un jūs tos izmantosit īpašiem mērķiem.
Abstraktās bāzes klases
Abstraktās bāzes klases nodrošina veidu, kā definēt kopīgus laukus un metodes, kuras var mantot vairāki modeļi. Piemēram, ja jums ir divi modeļi, kuriem ir līdzīgi lauki, varat izmantot abstraktu bāzes klasi, lai definētu līdzīgus laukus. Apskatiet šo piemēru:
klasēKlients(modeļi. Modelis):
nosaukums = modeļi. CharField (max_length=50)
e-pasts = modeļi. E-pasta lauks()
klienta_id = modeļi. Vesels skaitļa lauks()
klasēPārdevējs(modeļi. Modelis):
nosaukums = modeļi. CharField (max_length=50)
e-pasts = modeļi. E-pasta lauks()
pārdevēja_id = modeļi. Vesels skaitļa lauks()
Iepriekš minētais koda fragments definē divus Django modeļus: Klients un Pārdevējs. Šiem modeļiem ir divi kopīgi lauki, proti nosaukums un e-pasts. Lai novērstu šo dublēšanos, varat izveidot atsevišķu modeli, kas satur kopējos laukus Klients un Pārdevējs modeļus un padarīt to abstraktu.
klasēLietotāja informācija(modeļi. Modelis):
nosaukums = modeļi. CharField (max_length=50)
e-pasts = modeļi. E-pasta lauks()
klasēMeta:
abstrakts = Taisnība
Iepriekš minētais koda fragments definē jaunu modeli un iestata abstrakts piedēvēt Taisnība. Tas nozīmē, ka modelis būs abstrakts, un Django neizveidos tabulu datu bāzē.
Jūs varat pārrakstīt Klients un Pārdevējs tādi modeļi kā šis:
klasēKlients(Lietotāja informācija):
klienta_id = modeļi. Vesels skaitļa lauks()
klasēPārdevējs(Lietotāja informācija):
pārdevēja_id = modeļi. Vesels skaitļa lauks()
Iepriekš esošajā koda fragmentā Klients un Pārdevēji modeļi manto no Lietotāja informācija modeļa vietā modeļiem. Modelis.
Savus modeļus varat skatīt administratora panelī, reģistrējot tos savā admin.py šāds fails:
no .modeļi imports Klients, Pārdevējs
admin.site.register (klients)
admin.site.register (pārdevējs)
Migrējiet savus režīmus un sāciet izstrādes serveri, izpildot tālāk norādīto uz a komandrinda:
python manage.py makemigrations \
&& python manage.py migrēt \
&& python manage.py runserver
Dodieties uz savu administratora vietni un piesakieties ar savu superlietotāja informāciju. Katram modelim vajadzētu redzēt visus trīs laukus.
Šajā piemērā Django ir izveidojis tabulu Klients un Pārdevējs modeļiem. Jūs varat redzēt, ka Lietotāja informācija modelim nav tabulas, jo tas ir abstrakts.
Vairāku tabulu mantošana
Varat izmantot vairāku tabulu pārmantošanu, ja datu bāzē līdzās pakārtotajam modelim ir jāpastāv arī kā tabulai.
Atšķirībā no abstraktās bāzes klases mantojuma, kur vecākmodelis nebūs tabula datu bāzē, vairāku tabulu mantošana izveido tabulu vecākajam modelim.
Vairāku tabulu mantojumā pakārtotais modelis manto visus laukus un metodes no sava vecākmodeļa un pievieno savus īpašos laukus. Ārējās atslēgas palīdzēt izveidot modeļa attiecības starp vecāku un bērnu modeļiem.
Šeit ir vairāku tabulu mantojuma piemērs:
klasēPersona(modeļi. Modelis):
first_name = modeļi. CharField (max_length=100)
uzvārds = modeļi. CharField (max_length=100)defget_name(pats):
atgrieztiesf"{self.first_name}{self.last_name}"klasēMeta:
abstrakts = TaisnībaklasēDarbinieks(Persona):
darbinieka_id = modeļi. CharField (max_length=20)
nodaļa = modeļi. CharField (max_length=100)
alga = modeļi. FloatField()
dob = modeļi. Datuma lauks()
klasēPārvaldnieks(Darbinieks):
nosaukums = modeļi. CharField (max_length=100)
Šis koda fragments definē trīs modeļus. Pirmais modelis, saukts Persona, ir abstrakts. Tas nosaka tikai personas vārdu un uzvārdu.
Otrais modelis, saukts Darbinieks, manto laukus Persona bet definē papildu laukus. The Darbinieks modelis nav abstrakts, tāpēc tam būs sava tabula datu bāzē.
Galīgais modelis, saukts Pārvaldnieks, manto laukus Darbinieks modeli un pievieno lauku ar nosaukumu virsraksts.
Attiecības starp Darbinieks un Pārvaldnieks modeļus sauc Vairāku tabulu mantošana. Migrējiet savus modeļus, reģistrējiet tos admin.py, startējiet savu serveri un pārejiet uz administratora paneli. Jums vajadzētu redzēt divas Django izveidotās tabulas.
Mēģinot pievienot jaunu pārvaldnieku, pamanīsit, ka tajā ir visi lauki no Darbinieks modeli, kā arī savu pielāgoto lauku.
Starpniekserveru modeļi
Starpniekservera modelis palīdz izveidot jaunu modeli, kas tiek paplašināts no esoša modeļa, neveidojot jaunu datu bāzes tabulu. Šāda veida modeļu mantojumā starpniekserveri un oriģinālajiem modeļiem būs viena tabula. Izmantojot starpniekservera modeļus, varat izveidot pielāgotus modeļus un mainīt noklusējuma pārvaldniekus.
Varat izveidot starpniekservera modeli, pievienojot proxy=Tiesa iekš Meta klasē. Šeit ir piemērs:
klasēStarpniekservera modelis(Pamatmodelis):
klasēMeta:
starpniekserveris = Taisnība
Tipiska starpniekservera modeļa izmantošana ir piemērota, ja pastāv bāzes modelis un ir nepieciešams izveidot specializētu tā versiju ar papildu funkcionalitāti. Šeit ir pamata piemērs:
klasēPost(modeļi. Modelis):
nosaukums = modeļi. CharField (max_length=30)
autors = modeļi. CharField (max_length=30)def__str__(pats):
atgriezties sevis.nosaukumsklasēProxyPost(Ziņa):
klasēMeta:
starpniekserveris = Taisnība
Šis koda fragments definē divus modeļus: Post un MyPost. The Post modelis definē divus laukus nosaukumam un autoram. The ProxyPost modelis manto no Post modelis.
Migrējiet iepriekš minētos modeļus un pievienojiet jaunu ziņu tabulai, kas izveidota šim Post modelis.
Pēc ziņas pievienošanas atveriet Starpniekservera ziņas tabula. Jums vajadzētu atrast ziņu, kuru pievienojāt Post galds tajā.
Izmaiņas, ko veicat ziņās vietnē Starpniekservera ziņas tabula ietekmēs atbilstošo ziņu Post tabulā, un otrādi. Tas pierāda, ka viņiem patiešām ir viena tabula.
Jūs varat modificēt str() starpniekservera modeļa metode:
klasēProxyPost(Ziņa):
klasēMeta:
starpniekserveris = Taisnība
pasūtīšana = ["nosaukums"]
def__str__(pats):
atgriezties paš.autors
Ar šo modifikāciju a ProxyPost's virknes attēlojums būs tā autors, nevis nosaukums. Starpniekservera modeļa secība būs arī pēc nosaukuma, nevis noklusējuma ID lauka.
Izmantojot starpniekservera modeļus, ņemiet vērā, ka starpniekservera modelim nevar pievienot pielāgotus laukus. Starpniekservera modeļu primārais izmantošanas gadījums ir tad, ja vēlaties, lai viens modelis atbalstītu vairākas darbības.
Starpniekservera modeļi palīdz mainīt esošā modeļa uzvedību, nemainot tā laukus vai pamatā esošās datu bāzes tabulas struktūru.
Izmantojiet modeļa pārmantošanu koda atkārtotai izmantošanai un organizācijas struktūrai
Izmantojot dažādas modeļu mantošanas metodes, varat viegli izveidot atkārtoti lietojamu un sakārtotu kodu savam projektam.
Modeļa mantošana novērš lieku kodu un uzlabo jūsu koda apkopi un mērogojamību. Tas arī atvieglo navigāciju kodā, tādējādi veicinot efektīvu sadarbību starp izstrādes komandām.
Papildus modeļu pārmantošanai Django piedāvā arī veidņu pārmantošanu, kas ir lielisks veids, kā pārvaldīt un sakārtot jūsu projektu veidnes.