Django ORM (QuerySety)
V tejto kapitole sa naučíš, ako sa Django pripája k databáze a ukladá do nej údaje. Poďme na to!
Čo je QuerySet?
QuerySet je v podstate zoznam objektov daného modelu. QuerySet ti umožňuje čítať dáta z databázy, filtrovať a zoraďovať ich.
Najjednoduchšie bude ukázať si to na príklade. Vyskúšajme si to, čo povieš?
Django konzola
Otvor si lokálnu konzolu (nie na PythonAnywhere) a napíš tento príkaz:
Toto by sa ti malo zobraziť:
Teraz si v interaktívnej Django konzole. Je to ako konzola Pythonu, ale s trochou Django mágie. :) Môžeš v nej používať všetky pythonové príkazy.
Všetky objekty
Skúsme najskôr zobraziť všetky naše príspevky. To sa robí nasledovným príkazom:
Ups! Objavila sa chybová hláška. Hovorí nám, že nič také ako Post neexistuje. To dáva zmysel - zabudli sme ho totiž najskôr naimportovať!
Naimportujeme model Post
z blog.models
. Skúsme teda znova zobraziť všetky príspevky:
Je to zoznam príspevkov, ktoré sme vytvorili dávnejšie! Vytvorili sme ich pomocou Django administrátorského rozhrania. No radi by sme vytvorili nové príspevky pomocou Pythonu, tak ako na to?
Vytvorenie objektu
Takto vytvoríš nový objekt typu Post v databáze:
Chýba nám však jedna prísada: me
. Ako autorku musíme vložiť inštanciu User
modelu. Ako to urobiť?
Najskôr naimportujme User model:
Akých užívateľov a užívateľky máme v našej databáze? Skús toto:
Toto je superuser, ktorého sme vytvorili dávnejšie! Poďme ho dostať ako inštanciu (uprav tento riadok tak, aby obsahoval tvoje vlastné užívateľské meno):
Ako môžeš vidieť, teraz sme dostali (get
) Usera
s užívateľským menom (username
) 'ola'. Môže byť!
Teraz už konečne môžeme vytvoriť náš prvý príspevok:
Hurá! Chceš si overiť, či to zabralo?
Je to tam, jeden príspevok v zozname pribudol!
Pridanie ďalších príspevkov
Teraz sa môžeš trochu zabaviť a pridať pár ďalších príspevkov, aby si si vyskúšala, ako to funguje. Pridaj dva-tri ďalšie príspevky a potom poďme na ďalšiu časť.
Filtrovanie objektov
Dôležitou vlastnosťou QuerySetov je možnosť ich filtrovať. Povedzme, že chceme nájsť všetky príspevky, ktorých autorkou je užívateľka (User) ola. Použijeme filter
namiesto all
v príkaze Post.objects.all()
. V zátvorkách definujeme jednu alebo viac podmienok, ktoré má príspevok spĺňať, aby skončil v našom querysete. V našom prípade je to author
, ktorý sa rovná me
. V Djangu to napíšeš takto: author=me
. Náš kúsok kódu bude teraz vyzerať takto:
Alebo možno chceme vyhľadať všetky príspevky, ktoré obsahujú slovo 'title' v poli title
?
Poznámka Medzi
title
acontains
sú dva podčiarkovníky (_
). Django ORM používa túto syntax, aby oddelil názvy polí ("title") a operácie či filtre ("contains"). Ak použiješ iba jeden podčiarkovník, dostaneš chybu "FieldError: Cannot resolve keyword title_contains".
Môžeš tiež získať zoznam všetkých publikovaných príspevkov. To urobíme vyfiltrovaním príspevkov, ktorých published_date
je v minulosti:
Bohužiaľ, príspevok, ktorý sme pridali z konzoly Pythonu, ešte nie je publikovaný. To môžeme zmeniť! Najskôr získaj inštanciu príspevku, ktorý chceme publikovať:
A potom ho zverejni pomocou našej metódy publish
:
Teraz skús získať zoznam publikovaných postov znova (stlač šípku hore trikrát a stlač enter
):
Zoradenie objektov
QuerySety tiež umožňujú zoradiť zoznamy objektov. Skúsme ich zoradiť podľa dátumu vytvorenia (pole created_date
):
Poradie môžeme vymeniť pridaním -
na začiatok:
Zložité požiadavky pomocou reťazenia metód
Ako sme videli, niektoré metódy na Post.objects
vracajú QuerySet. Tie isté metódy môžeš zavolať na ďalšom QuerySete a vrátia ti nový QuerySet. Týmto môžeš kombinovať ich efekt reťazením:
To je skutočne silný nástroj, vďaka ktorému môžeš písať pomerne komplexné požiadavky (queries).
Super! Teraz si pripravená na ďalšiu časť! Django konzolu zatvoríš príkazom:
Last updated