Django ORM (tvorba dotazů)
V této kapitole se naučíš, jak se Django spojuje s databází a jak do ní ukládá data. Pojďme na to!
Co je QuerySet?
QuerySet je v podstatě seznam objektů daného modelu. QuerySet ti umožňuje číst data z databáze, filtrovat je a řadit je.
Je snazší naučit se to na příkladu. Pojďme to zkusit.
Django shell
Otevři svou lokální konzoli (ne na Python Anywhere) a napiš tento příkaz:
Mělo by to mít takovýto efekt:
Nyní jsi v Django interaktivní konzoli. Je to stejné jako Python konzole, ale s nějakými přídavnými Django kouzly :). Tady můžeš samozřejmě používat i všechny Python příkazy.
Všechny objekty
Pojďme zkusit zobrazit všechny naše příspěvky. To můžeš udělat následujícím příkazem:
Ale ne! Ukázala se chybová hláška. Říká nám, že tu není žádný Post objekt (příspěvek). To je správně – zapomněly jsme je importovat!
Tohle je jednoduché: importujeme model Post
z blog.models
. Pojďme znovu zkusit zobrazit všechny příspěvky:
To je seznam příspěvků, které jsme dříve vytvořily pomocí Django administrátorského rozhraní. Teď nicméně chceme vytvořit příspěvky použitím Pythonu, tak jak na to?
Vytvoř objekt
Takhle vytvoříš nový Post objekt v databázi:
Ale chybí nám tu jedna ingredience: proměnná me
. Jako autorku potřebujeme vložit instanci User
(tj. "uživatelka") modelu. Jak to uděláme?
Nejdříve pojďme importovat User model:
Jaké uživatele máme v naší databázi? Zkus tohle:
Tohle je superuser, kterého jsme vytvořily dříve! Pojďme si teď vzít instanci tohoto uživatele:
Jak vidíš, dostaly (tj. get
) jsme uživatele (tj. user
) s uživatelským jménem (tj. username
) 'ola'. Pěkný! Samozřejmě ty si to musíš upravit na své jméno.
Teď můžeme konečně vytvořit příspěvek:
Hurá! Chceš se podívat, jestli to fungovalo?
A je to tu, další příspěvek v seznamu!
Přidej více příspěvků
Teď si můžeš trochu pohrát a přidat více příspěvků, abys viděla, jak to funguje. Přidej 2 až 3 nové příspěvky a pusť se do další části.
Filtrování objektů
Důležitá součást QuerySetů je možnost je filtrovat. Řekněme, že chceme najít všechny příspěvky, jejichž autorem je uživatel (user) ola. V Post.objects.all()
použijeme filter
místo all
. V závorkách stanovíme podmínky, které musí příspěvek splňovat, aby skončil v našem querysetu. V našem případě je to tak, že author
se rovná ja
. Způsob, jakým se to v Django zapisuje, je: author=ja
. Teď náš kus kódu vypadá takhle:
Nebo možná chceme vidět všechny příspěvky, jež mají slovo 'titulek' v poli title
?
Poznámka Mezi
title
acontains
jsou dvě podtržítka (_
). Django ORM používá tuto syntaxi k rozlišení názvů ("title") a operací nebo filterů ("contains"). Pokud použiješ pouze jedno podtržítko, dostaneš chybovou hlášku "FieldError: Cannot resolve keyword title_contains".
Také můžeš získat seznam všech publikovaných příspěvků. Uděláme to vyfiltrováním všech příspěvků, které mají nastavené published_date
na nějaké uplynulé datum:
Bohužel příspěvek, který jsme přidali pomocí Python konzole, ještě není publikován. To můžeme změnit! Nejdřív vezmeme instanci příspěvku, který chceme publikovat:
A ten publikujeme pomocí naší metody publish
!
Teď se znovu pokus získat seznam publikovaných příspěvků (3krát zmáčkni šipku nahoru a zmáčkni enter
):
Řazení objektů
QuerySety ti také umožňují seřadit seznam objektů. Pojďme je zkusit seřadit podle data vytvoření (created_date
):
Můžeme je také seřadit obráceně přidáním -
na začátek:
Řetězení QuerySetů
QuerySety můžeš také kombinovat dohromady pomocí řetězení:
Je to mocný nástroj, který ti umožňuje psát docela komplexní query.
Cool! Teď jsi připravená na další část! Pro zavření shell konzole zadej toto:
Last updated