
Python – 24. časť Django V
V predošlej časti seriálu sme vám predstavili druhú verziu vzorovej aplikácie, v rámci ktorej sme začali využívať metódy tried Manager a QuerySet, a to bez toho, aby sme vysvetlili ich význam. Práve preto sa k nim teraz vrátime a predstavíme detaily ich funkcionality. Pripomeňme, že Manager je rozhranie, pomocou ktorého sú výstupy otázok smerujúcich na databázu (dB Queries) odovzdávané modelom. Výstupy manažéra sú súborom objektov triedy QuerySet. Objekty nachádzajúce sa v súbore QuerySet možno po ich vytvorení mnohými spôsobmi filtrovať, limitovať a agregovať, čím získavame požadované konkretizované výstupy.
dB API
Django pri vytváraní objektov typu Model automaticky vytvára abstraktné databázové API, resp. tzv. Object Relational Mapping vrstvu, pomocou ktorej možno vytvárať, získavať, aktualizovať a mazať databázové objekty. Objekt triedy Model je databázová tabuľka, pričom inštancia triedy reprezentuje jeden konkrétny záznam. Pomocou nasledujúcich metód možno potom vykonávať požadované databázové operácie:
save() |
INSERT |
Ak záznam neexistuje – vloženie nového záznamu do dB |
save() |
UPDATE |
Ak záznam existuje – aktualizácia záznamu v dB |
save() |
ForeignKey |
Aktualizácia ForeignKey |
add() |
ManyToManyField |
Pridanie prepojeného záznamu / prepojených záznamov |
update() |
Spolu s QuerySet |
Aktualizácia záznamu / záznamov v QuerySet, pozor však na nutnosť uloženia do dB pomocou metódy save() |
delete() |
Spolu s inštanciou alebo s QuerySet |
Zmazanie záznamu / záznamov vrátane všetkých záznamov prepojených prostredníctvom ForeignKey (ide o štandardnú funkcionalitu SQL ON DELETE CASCADE) |
create(), remove(), clear(), set() |
Related objects OneToOneField ManyToManyField |
Práca s prepojenými objektmi |
Obr. 1 Django Object Relational Mapping layer
Model, Manager a QuerySet
Na získavanie záznamov uložených v databázových tabuľkách používame metódy používateľsky prispôsobiteľnej (customizabled) triedy Manager. Tie sú ekvivalentné SQL výrazu SELECT s aplikovaním príslušných filtrov WHERE a obmedzení LIMIT/OFFSET. Výstupom uvedených metód sú tzv. QuerySet (takisto customizabled), ktoré môžu byť prázdne, môžu obsahovať jediný záznam alebo množinu záznamov. QuerySet sa z dôvodu efektívneho prístupu k databázovým tabuľkám vytvárajú až v okamihu spustenia exekutívneho príkazu a navyše svoj obsah uchovávajú v cache, na čo si treba dať pozor najmä pri reťazení požiadaviek.
Django každému modelu automaticky priraďuje najmenej jeden manažér, ktorý nazýva kľúčovým slovom objects. Toto slovo nepripájame k inštancii triedy Model, ale používame ho priamo s názvom triedy takto:
názov_triedy(models.Model).objects
Následne spolu s kľúčovým slovom objects voláme tieto metódy:
all() |
SELECT * FROM |
QuerySet bude obsahovať všetky záznamy tabuľky |
all()[offset:limit] |
SELECT * FROM OFFSET x LIMIT y |
QuerySet bude obsahovať v poradí (x+1)-tý až (y)-tý záznam |
filter(**kwargs) |
SELECT * FROM WHERE podmienky |
QuerySet bude obsahovať tie záznamy, ktoré spĺňajú stanovené podmienky |
exclude(**kwargs) |
SELECT * FROM WHERE podmienky |
QuerySet nebude obsahovať tie záznamy, ktoré spĺňajú stanovené podmienky |
get() |
SELECT * FROM WHERE podmienky |
Získanie jediného záznamu, ktorý spĺňa podmienky Ak záznam neexistuje, výstupom je: „DoesNotExist“ Ak existuje viacero záznamov spĺňajúcich podmienku, výstupom je: „MultipleObjectsReturned“ |
raw() |
raw(SQL výraz) |
Priame vykonanie požadovaného výrazu SQL – vráti RawQuerySet |
Obr. 2 Vzťah medzi Model, Manager a QuerySet
Jednotlivé metódy možno vzájomne reťaziť, čím zo základných QuerySet získavame nové QuerySet. Argumenty **kwargs reprezentujú kritériá, resp. podmienky, ktoré majú byť použité pri napĺňaní QuerySet. Formát zápisu uvedených podmienok je opísaný v rámci tzv. Field lookups. Základný formát podmienky je:
názov_premennej_modelu__typ = výraz
pričom:
názov_premennej_modelu = názov stĺpca tabuľky, resp. kľúča
typ = lookup typ (popísaný v rámci tzv. field lookup reference)
výraz = hodnota, s ktorou porovnávame
Medzi lookup typy, ktoré môžeme použiť na zápis podmienok, patria:
exact / iexact |
Obsah požadovaného stĺpca záznamu sa zhoduje so zadaným výrazom, iexact = case-insensitive = písmená môžu byť malé aj veľké |
contains / icontains |
Stĺpec záznamu obsahuje zadaný výraz |
in |
Obsah stĺpca záznamu sa zhoduje s prvkami zadaného výrazu |
gt / lt gte / lte |
Obsah stĺpca záznamu je väčší / menší ako zadaný výraz greater (less) than or equal to = väčší (menší) alebo rovný |
startswith / endswith istartswith / iendswith |
Obsah stĺpca záznamu sa začína / končí výrazom |
range |
Obsah stĺpca záznamu patrí do zadaného intervalu |
date, [year, iso_year, month, day, week, week_day, quarter] |
Obsah stĺpca záznamu je typu date / datetime (pozor na Time Zone konf.) date (datetime) typ obsahuje zadaný rok (ISO formát roku), mesiac, deň v roku, týždeň, deň v týždni, štvrťrok |
time, [hour, minute, second] |
Date / datetime typ obsahuje zadaný čas, hodinu, minútu, sekundu |
isnull |
Obsah stĺpca záznamu je prázdny |
regex / iregex |
Obsah stĺpca záznamu bude porovnávaný s regulárnym výrazom |
Avg(), Count(), Max(), Min(), StdDev(), Sum(), Variance() |
Agregačné funkcie aplikované pomocou klauzúl annotate() a aggregate(), ktoré možno doplniť o klauzuly order_by() a values() |
SQL queries
Tému týkajúcu sa podmienok pri tvorbe QuerySet ukončíme konštatovaním, že okrem porovnávania s výrazmi možno porovnávať s obsahom iného stĺpca rovnakého modelu, teda rovnakej tabuľky, a to pomocou tzv. F() výrazov (F expressions). Okrem toho sa dajú využiť ďalšie nástroje ako Q(), Prefetch(), FilteredRelation() objekty a takisto priamy prístup do databázy prostredníctvom objektu db.connection. Podrobný opis komplexnej funkcionality QuerySet ďaleko presahuje rámec tohto článku, a preto iba poukážeme na existenciu podrobného referenčného dokumentu QuerySet API reference, ktorý možno nájsť v rámci dokumentácie na webovej stránke frameworku Django.
Tvorba SQL otázok (queries) je opísaná nesmierne rozsiahlym systémom, ktorého časti možno mnohými spôsobmi kombinovať. V tomto prípade nehovoríme iba o dB API Djanga, ale najmä o jazyku SQL, ktorý sám osebe ponúka obrovské množstvo rôznych vyhľadávacích konštrukcií. Viac možno naštudovať buď v štandardnej referencii jazyka SQL, alebo v súvislosti s Djangom na stránke https://docs.djangoproject.com/en/2.2/topics/db/.
Zobrazit Galériu