Како написати ефикасне приказе, моделе и упите у Дјанго-у

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

Радио сам обе ове ствари и током година открио сам како да користим неке од Дјангових карактеристика за максималну ефикасност. Су:

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

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

Прикази засновани на класи наспрам функција

Запамтите да је Дјанго сав Питхон испод хаубе. Када су у питању прикази, имате два избора: функције приказа (које се понекад називају и „прикази засновани на функцијама“) или прикази засновани на класама.

Пре много година, када сам први пут изградио АпплиБиАПИ, он се у почетку састојао у потпуности од приказа заснованих на функцијама. Они нуде детаљну контролу и добри су за примену сложене логике. Баш као и у Питхон функцији, и ви имате потпуну контролу (у добру и у злу) над оним што чини приказ.

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

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

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

На крају сам задржао АпплиБиАПИ док сам већину приказа преобликовао у погледе засноване на класама. Ово није био мали посао и рефакторирање, али кад је то завршено, имао сам гомилу сићушних погледа који су направили огромну разлику. Мислим, погледајте само овај:

class ApplicationsList(ListView): model = Application template_name = "applications.html" 

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

Призоре заснован на настави можете сматрати предлошцима који покривају већину функционалности било које апликације која је потребна. Постоје прикази за приказивање списка ствари, за детаљно прегледање ствари и уређивање погледа за обављање ЦРУД (Цреате, Реад, Упдате, Делете) операција.

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

Погледи засновани на разредима се брзо имплементирају и користе. Уграђени генерички погледи засновани на класама могу захтевати мање посла за тестирање, јер не треба да пишете тестове за основни приказ који Дјанго пружа. (Дјанго ради сопствене тестове за то; није потребно да ваша апликација поново проверава.)

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

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

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

Дјанго модели

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

Као и погледи, Дјанго нуди неке уграђене типове модела ради практичности примене основне провере идентитета, укључујући моделе корисника и дозволе. За све остало можете створити модел који одражава ваш концепт наслеђивањем из родитељске класе Модел.

class StaffMember(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) company = models.OneToOneField(Company, on_delete=models.CASCADE) def __str__(self): return self.company.name + " - " + self.user.email 

Када креирате прилагођени модел у Дјанго-у, подразредите Дјанго-ову класу Модел и искористите сву његову моћ. Сваки модел који креирате углавном се пресликава на табелу базе података. Сваки атрибут је поље базе података. Ово вам даје могућност стварања предмета за рад са којима људи могу боље да разумеју.

Можете да направите модел користан за вас тако што ћете дефинисати његова поља. Многи уграђени типови поља су повољно обезбеђени. Они помажу Дјангу да схвати тип података, ХТМЛ виџет који ће користити приликом приказивања обрасца, па чак и захтеве за валидацију обрасца. Ако је потребно, можете написати прилагођена поља модела.

Односи са базом података могу се дефинисати помоћу поља ФореигнКеи (више-према-једном) или МаниТоМаниФиелд (дају вам три нагађања). Ако то није довољно, постоји и ОнеТоОнеФиелд.  

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

Дохваћање објеката са упитима

Користите Манагер свог модела ( objectsподразумевано) за изградњу КуериСет-а. Ово је приказ објеката у вашој бази података које можете да прочистите, користећи методе, да бисте преузели одређене подскупове. Све доступне методе су у АПИ-ју КуериСет и могу се повезати ланцима за још већу забаву.

Post.objects.filter( type="new" ).exclude( title__startswith="Blockchain" ) 

Неке методе враћају нове КуериСетс, попут filter(), или exclude(). Њиховим уланчавањем можете добити моћне упите без утицаја на перформансе, јер се КуериСетс не преузимају из базе података док се не процене. Методе које вредновати скуп упита укључују get(), count(), len(), list()или bool().

Итерирање преко КуериСет-а такође га процењује, па избегавајте то чинити где год је то могуће како бисте побољшали перформансе упита. На пример, ако само желите да знате да ли је неки објекат присутан, можете да користите exists()да бисте избегли понављање над објектима базе података.

Користите get()у случајевима када желите да преузмете одређени објекат. Ова метода се повећава MultipleObjectsReturnedако се догоди нешто неочекивано, као и DoesNotExistизузетак, ако, погодите.

Ако желите да добијете објекат који можда не постоји у контексту корисничког захтева, уместо њега користите погодан get_object_or_404()или get_list_or_404()који подиже . Ове корисне пречице одговарају управо овој сврси. Да бисте створили објекат који не постоји, постоји и погодно .Http404DoesNotExistget_or_create()

Ефикасне основне ствари

Сада сте се упознали са ова три основна алата за изградњу ваше ефикасне Дјанго апликације - честитамо!

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

Ако ћете надограђивати ГитХуб, можда ћете желети да подесите моју дјанго-сецурити-цхецк ГитХуб Ацтион. У међувремену сте на добром путу да направите леп софтверски пројекат.