SAMSUNG_032023 Advertisement SAMSUNG_032023 Advertisement SAMSUNG_032023 Advertisement

Python – 24. časť Django V

0

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 ManagerQuerySet, 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

Marek Sopko

Všetky autorove články

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať