Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Django: Databázový model podruhé

Honza Kral
Honza Kral (neregistrovaný) ---.net.upc.cz
4. 9. 2009 10:16

len vs .count() a dalsi drobnosti

Ke zjistovani poctu zaznamu je nevhodne pouzivat funkci len – stahne vsechny zaznamy z DB a spocita je misto toho aby se proste DB zeptala na pocet (SELECT COUNT(*) …) jako do tela metoda .count()

Misto .filter()[0] je lepsi vetsinou pouzit .get(), ma tu vyhodu ze sam hlida ze DB ma vratit prave jeden objekt a neni tak krypticky.

Mozna by take stalo za to zminit lazy vlastnost querysetu a jak se daji querysety za sebou retezit, tedy ze muzu udelat

>>> q = Store.objects.all()
>>> q = q.filter(id__lte=10)
>>> q = q.exclude(id=1)
>>> q = q.order_by('-id')
>>> stores = q[:2]

A ve vysledku se udela jen jeden dotaz do DB. Obecne dotazy do DB se provedou pri iterovani pres queryset, sliceovani ([]) a volani .get ci .count. Specialni pripad je v ramci prace v interaktivnim rezimu, ktery vzdy vola repr() na vracene hodnote aby ho zobrazil uzivateli – repr() u querysetu vyvola iteraci a dotaz se tak provede.

Jinak dekuji za clanky, myslim si, ze je neco takoveho potreba :).

Pavel Dvořák
4. 9. 2009 10:34

Re: len vs .count() a dalsi drobnosti

Díky za hodnotné připomínky, get jsem tam stručně zmínil, lenost a řetězení taky. S tím countem máte naprostou pravdu, je to efektivnější a neměl jsem o tom ani tušení. Django mě neustále překvapuje novými funkcemi…

Tomaasch
Tomaasch (neregistrovaný) 84.244.101.---
4. 9. 2009 10:49

Re: len vs .count() a dalsi drobnosti

No, ten count() neni ani tak funkce Djanga, ale vychazi z vlastnosti SQL databaze. Navic tyto ‚nove funkce‘ jsou zminene i v originalni dokumentaci, takze to by Vas prilis prekvapovat nemelo – narazim hlavne na ‚.get()‘ metodu, ktera se od Vami popsanych vyberovych kriterii atributu object lisi jen tim, ze nevraci Queryset, ale primo vlastni objekt.

Pavel Dvořák
4. 9. 2009 10:57

Re: len vs .count() a dalsi drobnosti

Ano, samozřejmě, databázovou klauzuli COUNT znám, jenom jsem nevěděl, že to má Django implementováno jako zvláštní metodu – příště musím lépe nastudovat manuál. A metodu get jsem tam zmínil a přiložil na ní odkaz, i když jsem ji v rámci zpřehlednění nepoužil, rozhodně s ní však budu pracovat v nějakém dalším díle.

Zasílat nově přidané příspěvky e-mailem