Наслеђивање вам омогућава да поново користите код и креирате чистије моделе података. Али Дјанго нуди више од једног начина наслеђивања, па се уверите да знате разлике.

Наслеђивање модела је Дјанго ОРМ функција која омогућава програмерима да креирају хијерархијске односе између модела базе података. Омогућава поновну употребу кода, проширивост и чистију базу кода користећи принципе објектно оријентисаног програмирања.

Без обзира да ли правите сложену веб апликацију или радите на мањем пројекту, наслеђивање модела може понудити значајне предности, као што је смањење редунданције и обезбеђење доследног понашања.

Типови наслеђивања модела у Дјангу

Дјанго нуди подршку за три типа наслеђивања модела:

  1. Апстрактне основне класе.
  2. Наслеђивање са више таблица.
  3. Прокси модели.

Сваки од ових типова наслеђивања модела има предности и користићете их у одређене сврхе.

Апстрактне основне класе

Апстрактне базне класе обезбеђују начин да се дефинишу уобичајена поља и методе које више модела може наследити. На пример, ако имате два модела која деле слична поља, можете користити апстрактну основну класу да дефинишете слична поља. Погледајте овај пример:

класаЦустомер(модели. модел):
назив = модели. ЦхарФиелд (мак_ленгтх=50)
емаил = модели. ЕмаилФиелд()
цустомер_ид = модели. ИнтегерФиелд()

класапродавац(модели. модел):
назив = модели. ЦхарФиелд (мак_ленгтх=50)
емаил = модели. ЕмаилФиелд()
селлер_ид = модели. ИнтегерФиелд()

Исечак кода изнад дефинише два Дјанго модела: Цустомер и продавац. Ови модели деле два заједничка поља, наиме име и емаил. Да бисте спречили ову редундантност, можете креирати посебан модел за држање заједничких поља у Цустомер и продавац моделе и чине га апстрактним.

класаПодаци о кориснику(модели. модел):
назив = модели. ЦхарФиелд (мак_ленгтх=50)
емаил = модели. ЕмаилФиелд()

класаМета:
апстрактно = Истина

Горњи исечак кода дефинише нови модел и поставља апстрактан приписати Истина. То значи да ће модел бити апстрактан и Дјанго неће креирати табелу у бази података.

Можете преписати Цустомер и продавац модели попут овог:

класаЦустомер(Подаци о кориснику):
цустомер_ид = модели. ИнтегерФиелд()

класапродавац(Подаци о кориснику):
селлер_ид = модели. ИнтегерФиелд()

У исечку кода изнад, тхе Цустомер и Продавци модели наслеђују од Подаци о кориснику модел уместо модели. Модел.

Своје моделе можете погледати у административном панелу тако што ћете их регистровати у свом админ.пи фајл овако:

из .модели увоз Купац, продавац

админ.сите.регистер (корисник)
админ.сите.регистер (Продавац)

Мигрирајте своје модове и покрените развојни сервер тако што ћете покренути следеће на а командна линија:

питхон манаге.пи макемигратионс \
&& питхон манаге.пи мигрира \
&& питхон манаге.пи рунсервер

Идите до свог администраторског сајта и пријавите се са подацима о суперкориснику. Требало би да видите сва три поља за сваки модел.

У овом примеру, Дјанго је креирао табелу за Цустомер и продавац модели. Можете видети да је Подаци о кориснику модел нема табелу јер је апстрактан.

Наслеђивање са више табела

Можете да користите наслеђивање са више табела када родитељски модел такође треба да постоји као табела у бази података поред подређеног модела.

За разлику од наслеђивања апстрактне основне класе, где родитељски модел неће бити табела у бази података, наслеђивање са више табела ствара табелу за родитељски модел.

У наслеђивању са више табела, дете модел наслеђује сва поља и методе из свог надређеног модела и додаје своја специфична поља. Страни кључеви помоћи да се успостави модел односа између модела родитеља и детета.

Ево примера наслеђивања са више табела:

класаОсоба(модели. модел):
име = модели. ЦхарФиелд (мак_ленгтх=100)
презиме = модели. ЦхарФиелд (мак_ленгтх=100)

дефгет_наме(сам):
повратакф"{селф.фирст_наме}{селф.ласт_наме}"

класаМета:
апстрактно = Истина

класаЗапослени(особа):
Емплоиее_ид = модели. ЦхарФиелд (мак_ленгтх=20)
одељење = модели. ЦхарФиелд (мак_ленгтх=100)
плата = модели. ФлоатФиелд()
доб = модели. ДатеФиелд()

класаМенаџер(Запослени):
наслов = модели. ЦхарФиелд (мак_ленгтх=100)

Овај исечак кода дефинише три модела. Први модел, тзв Особа, је апстрактан. Дефинише само име и презиме особе.

Други модел, тзв Запослени, наслеђује поља од Особа али дефинише додатна поља. Тхе Запослени модел није апстрактан, тако да ће имати своју табелу у бази података.

Коначни модел, тзв Менаџер, наслеђује поља на Запослени модел и додаје поље под називом наслов.

Однос између Запослени и Менаџер модели се зове Наслеђивање са више табела. Мигрирајте своје моделе, региструјте их админ.пи, покрените свој сервер и идите до административног панела. Требало би да видите две табеле које је креирао Дјанго.

Када покушате да додате новог менаџера, приметићете да има сва поља из Запослени модел као и сопствено прилагођено поље.

Прокси модели

Прокси модел вам помаже да креирате нови модел који се протеже од постојећег модела без креирања нове табеле базе података. У овој врсти наслеђивања модела, прокси и оригинални модели ће делити исту табелу. Користећи прокси моделе, можете да радите ствари као што су креирање прилагођених модела и промена подразумеваних менаџера.

Можете креирати прокси модел додавањем проки=Тачно у Мета класа. Ево примера:

класаПрокиМодел(Основни модел):

класаМета:
проки = Истина

Типична употреба прокси модела је прикладна када постоји основни модел и постоји потреба да се креира његова специјализована верзија са додатном функционалношћу. Ево основног примера:

класапошта(модели. модел):
наслов = модели. ЦхарФиелд (мак_ленгтх=30)
аутор = модели. ЦхарФиелд (мак_ленгтх=30)

деф__стр__(сам):
повратак селф.титле

класаПрокиПост(Пошта):

класаМета:
проки = Истина

Овај исечак кода дефинише два модела: пошта и МиПост. Тхе пошта модел дефинише два поља за наслов и аутора. Тхе ПрокиПост модел наслеђује од пошта модел.

Мигрирајте горе наведене моделе и додајте нови пост у табелу креирану за пошта модел.

Након што додате пост, отворите Прокси постови сто. Требало би да пронађете пост који сте додали на пошта сто у њему.

Промене које уносите у постове у Прокси постови табела ће утицати на одговарајући пост у пошта сто, и обрнуто. Ово доказује да они заиста деле исти сто.

Можете модификовати стр() метод прокси модела:

класаПрокиПост(Пошта):

класаМета:
проки = Истина
наручивање = ["титула"]

деф__стр__(сам):
повратак селф.аутор

Овом модификацијом, а ПрокиПост'с репрезентација стринга ће бити њен аутор, а не наслов. Редослед прокси модела ће такође бити према наслову уместо према подразумеваном ИД пољу.

Када користите прокси моделе, треба да имате на уму да не можете додати прилагођена поља свом прокси моделу. Примарни случај употребе прокси модела је када желите да један модел подржава више понашања.

Прокси модели вам помажу да промените понашање постојећег модела без модификације његових поља или основне структуре табеле базе података.

Користите наслеђивање модела за поновну употребу кода и организациону структуру

Користећи различите технике наслеђивања модела, можете лако креирати вишекратну употребу и организовани код за свој пројекат.

Наслеђивање модела избегава сувишан код и побољшава могућност одржавања и скалабилност вашег кода. Такође олакшава навигацију кодом, чиме се подстиче ефикасна сарадња међу развојним тимовима.

Осим наслеђивања модела, Дјанго нуди наслеђивање шаблона, што је одличан начин за управљање и организовање шаблона за ваше пројекте.