Paveldėjimas leidžia pakartotinai naudoti kodą ir kurti švaresnius duomenų modelius. Tačiau „Django“ siūlo daugiau nei vieną paveldėjimo būdą, todėl įsitikinkite, kad žinote skirtumus.

Modelio paveldėjimas yra Django ORM funkcija, leidžianti kūrėjams sukurti hierarchinius ryšius tarp duomenų bazių modelių. Tai įgalina kodo pakartotinį naudojimą, išplečiamumą ir švaresnę kodo bazę, pasinaudodama objektinio programavimo principais.

Nesvarbu, ar kuriate sudėtingą žiniatinklio programą, ar dirbate su mažesniu projektu, modelio paveldėjimas gali pasiūlyti didelę naudą, pvz., sumažinti perteklumą ir užtikrinti nuoseklų elgesį.

Django modelio paveldėjimo tipai

„Django“ siūlo trijų tipų modelių paveldėjimo palaikymą:

  1. Abstrakčios bazinės klasės.
  2. Kelių lentelių paveldėjimas.
  3. Proxy modeliai.

Kiekvienas iš šių modelių paveldėjimo tipų turi pranašumų ir jūs juos naudosite konkretiems tikslams.

Abstrakčios bazinės klasės

Abstrakčios bazinės klasės suteikia galimybę apibrėžti bendruosius laukus ir metodus, kuriuos gali paveldėti keli modeliai. Pavyzdžiui, jei turite du modelius, kuriuose naudojami panašūs laukai, galite naudoti abstrakčią bazinę klasę, kad apibrėžtumėte panašius laukus. Pažvelkite į šį pavyzdį:

instagram viewer

klasėKlientas(modeliai. Modelis):
pavadinimas = modeliai. CharField (max_length=50)
paštas = modeliai. El. pašto laukas ()
kliento_id = modeliai. Sveikasis laukas ()

klasėPardavėjas(modeliai. Modelis):
pavadinimas = modeliai. CharField (max_length=50)
paštas = modeliai. El. pašto laukas ()
pardavėjo_id = modeliai. Sveikasis laukas ()

Aukščiau pateiktas kodo fragmentas apibrėžia du „Django“ modelius: Klientas ir Pardavėjas. Šie modeliai turi du bendrus laukus, būtent vardas ir paštu. Norėdami išvengti šio perteklinio pertekliaus, galite sukurti atskirą modelį bendriesiems laukams laikyti Klientas ir Pardavėjas modelius ir padaryti jį abstrakčiais.

klasėVartotojo informacija(modeliai. Modelis):
pavadinimas = modeliai. CharField (max_length=50)
paštas = modeliai. El. pašto laukas ()

klasėMeta:
abstrakčiai = Tiesa

Anksčiau pateiktas kodo fragmentas apibrėžia naują modelį ir nustato abstrakčiai priskirti Tiesa. Tai reiškia, kad modelis bus abstraktus, o Django nesukurs lentelės duomenų bazėje.

Galite perrašyti Klientas ir Pardavėjas modeliai tokie:

klasėKlientas(Naudotojo informacija):
kliento_id = modeliai. Sveikasis laukas ()

klasėPardavėjas(Naudotojo informacija):
pardavėjo_id = modeliai. Sveikasis laukas ()

Aukščiau esančiame kodo fragmente Klientas ir Pardavėjai modeliai paveldi iš Vartotojo informacija vietoj modelio modeliai. Modelis.

Savo modelius galite peržiūrėti administratoriaus skydelyje, užregistravę juos savo admin.py failas toks:

 .modeliai importuoti Klientas, Pardavėjas

admin.site.register (Klientas)
admin.site.register (pardavėjas)

Perkelkite režimus ir paleiskite kūrimo serverį vykdydami toliau nurodytus veiksmus a komandinė eilutė:

python manage.py makemigrations \
&& python manage.py perkelti \
&& python manage.py runserver

Eikite į savo administratoriaus svetainę ir prisijunkite naudodami savo supervartotojo informaciją. Turėtumėte matyti visus tris kiekvieno modelio laukus.

Šiame pavyzdyje Django sukūrė lentelę, skirtą Klientas ir Pardavėjas modeliai. Jūs galite pamatyti, kad Vartotojo informacija modelis neturi lentelės, nes jis yra abstraktus.

Kelių lentelių paveldėjimas

Galite naudoti kelių lentelių paveldėjimą, kai pirminis modelis taip pat turi egzistuoti kaip lentelė duomenų bazėje kartu su antriniu modeliu.

Skirtingai nuo abstraktaus bazinės klasės paveldėjimo, kai pirminis modelis nebus lentelė duomenų bazėje, kelių lentelių paveldėjimas sukuria pirminio modelio lentelę.

Kelių lentelių paveldėjimo atveju antrinis modelis paveldi visus laukus ir metodus iš pirminio modelio ir prideda specifinius laukus. Užsienio raktai padėti nustatyti modelio santykiai tarp tėvų ir vaikų modelių.

Štai kelių lentelių paveldėjimo pavyzdys:

klasėAsmuo(modeliai. Modelis):
vardas = modeliai. CharField (max_length=100)
pavardė = modeliai. CharField (max_length=100)

defgauti_vardą(savarankiškai):
grąžintif"{self.first_name}{self.pavard_vardas}"

klasėMeta:
abstrakčiai = Tiesa

klasėDarbuotojas(asmuo):
darbuotojo_id = modeliai. CharField (max_length=20)
skyrius = modeliai. CharField (max_length=100)
atlyginimas = modeliai. FloatField()
dob = modeliai. Datos laukas ()

klasėVadovas(Darbuotojas):
pavadinimas = modeliai. CharField (max_length=100)

Šis kodo fragmentas apibrėžia tris modelius. Pirmasis modelis, vadinamas Asmuo, yra abstraktus. Jis apibrėžia tik asmens vardą ir pavardę.

Antrasis modelis, vadinamas Darbuotojas, paveldi laukus Asmuo bet apibrėžia papildomus laukus. The Darbuotojas modelis nėra abstraktus, todėl duomenų bazėje turės savo lentelę.

Galutinis modelis, vadinamas Vadovas, paveldi laukus Darbuotojas modelį ir prideda lauką, vadinamą titulą.

Santykis tarp Darbuotojas ir Vadovas modeliai vadinami Kelių lentelių paveldėjimas. Perkelkite savo modelius, užregistruokite juos admin.py, paleiskite serverį ir eikite į administratoriaus skydelį. Turėtumėte pamatyti dvi Django sukurtas lenteles.

Kai bandysite pridėti naują valdytoją, pastebėsite, kad jame yra visi laukai iš Darbuotojas modelį, taip pat savo pasirinktinį lauką.

Proxy modeliai

Tarpinio serverio modelis padeda sukurti naują modelį, kuris tęsiasi nuo esamo modelio nekuriant naujos duomenų bazės lentelės. Tokio modelio paveldėjimo atveju tarpinis serveris ir originalūs modeliai turės tą pačią lentelę. Naudodami tarpinio serverio modelius galite kurti pasirinktinius modelius ir keisti numatytuosius valdytojus.

Galite sukurti tarpinio serverio modelį pridėdami proxy=Tiesa viduje Meta klasė. Štai pavyzdys:

klasėTarpinis modelis(Pagrindinis modelis):

klasėMeta:
tarpinis serveris = Tiesa

Įprastas tarpinio serverio modelio naudojimas yra tinkamas, kai yra bazinis modelis ir reikia sukurti specializuotą jo versiją su papildomomis funkcijomis. Štai pagrindinis pavyzdys:

klasėĮrašas(modeliai. Modelis):
pavadinimas = modeliai. CharField (max_length=30)
autorius = modeliai. CharField (max_length=30)

def__str__(savarankiškai):
grąžinti savęs.pavadinimas

klasėProxyPost(Įrašas):

klasėMeta:
tarpinis serveris = Tiesa

Šis kodo fragmentas apibrėžia du modelius: Įrašas ir „MyPost“.. The Įrašas modelis apibrėžia du pavadinimus ir autoriaus laukus. The ProxyPost modelis paveldi iš Įrašas modelis.

Perkelkite aukščiau nurodytus modelius ir pridėkite naują įrašą į lentelę, sukurtą Įrašas modelis.

Pridėję įrašą atidarykite Tarpinio serverio įrašai stalo. Turėtumėte rasti įrašą, kurį pridėjote prie Įrašas stalas jame.

Įrašų pakeitimai, kuriuos atliekate Tarpinio serverio įrašai lentelė turės įtakos atitinkamam įrašui Įrašas lentelę ir atvirkščiai. Tai įrodo, kad jie tikrai dalijasi tuo pačiu stalu.

Galite modifikuoti g() tarpinio modelio metodas:

klasėProxyPost(Įrašas):

klasėMeta:
tarpinis serveris = Tiesa
užsakymas = ["titulas"]

def__str__(savarankiškai):
grąžinti savęs.autorius

Su šia modifikacija a ProxyPost's eilutės atvaizdavimas bus jos autorius, o ne pavadinimas. Tarpinio serverio modelis taip pat bus tvarkomas pagal pavadinimą, o ne pagal numatytąjį ID lauką.

Naudodami tarpinio serverio modelius, turėkite omenyje, kad negalite pridėti pasirinktinių laukų prie tarpinio serverio modelio. Pagrindinis tarpinio serverio modelių naudojimo atvejis yra tada, kai norite, kad vienas modelis palaikytų kelis veiksmus.

Tarpinio serverio modeliai padeda pakeisti esamo modelio veikimą nekeičiant jo laukų ar pagrindinės duomenų bazės lentelės struktūros.

Naudokite modelio paveldėjimą kodo pakartotiniam naudojimui ir organizacijos struktūrai

Naudodami skirtingus modelio paveldėjimo būdus, galite lengvai sukurti pakartotinai naudojamą ir organizuotą savo projekto kodą.

Modelio paveldėjimas leidžia išvengti perteklinio kodo ir pagerina kodo priežiūrą bei mastelio keitimą. Tai taip pat palengvina kodo naršymą ir taip skatina veiksmingą kūrėjų komandų bendradarbiavimą.

Be modelio paveldėjimo, „Django“ siūlo šablonų paveldėjimą, kuris yra puikus būdas valdyti ir tvarkyti savo projektų šablonus.