Ahoj, 2017-12-13 11:31 GMT+01:00 MirekZv <[email protected]>:
> Nemohl byste mě někdo navést? > Na všechno o Djangu jsou milióny textů, ale zrovna o tomhle toho je > minimum a nemůžu najít nic dobrého. > > Napřed jsem ani nevěděl, že je nějaká extra podpora (kromě Inlinů v > Adminu) a myslel jsem, že prostě do modelu přidám vazební tabulku > (minimalisticky se 2 cizími klíči). > > Pak jsem zjistil, že existuje v modelu ManyToManyField a sice ve 2 > vzájemně nekompatibilních verzích: > bez through=... > s through=... (ten mi v Adminu negeneruje widget; dělám něco blbě nebo to > tak má být?) > > Obě pracují s vazební tabulkou, jen ve druhém případě k ní dělám model > vazební tabulky ručně. > A jak se tedy varianta s through= liší od toho, když udělám jen tu vazební > tabulku a pole ManyToManyField nepoužiju? > > Obecně bych doporučil použít variantu bez through=, když to tak stačí a o mezi tabulku se tím pádem vůbec nestarat. Pokud ji potřebuješ (typicky pro ukládání pořadí, ale i dalších věcí), tak pak je to ManyToManyField vlastně jen syntactic sugar, který Ti umožní se na připojené objekty snadněji dotazovat v případě, že tu data z mezitabulky zrovna v dané query nepotřebuješ. Další výhoda toho through (a já ji kvůli tomu mám někdy i v případech, kdy na mezitabulce nejsou žádná další data) je když potřebuješ udělat bulk select nad oběma propojenými tabulkami a v jedné query vybrat více propojených objektů (např. všechny autory, kteří začínají na "A" a k nim připojené články). To se pak dá dělat právě přes ten meziobjekt a pomocí select_related k tomu připojit objekty na obou stranách toho spojení. Select_related totiž jinak pro many-to-many použít nejde. > Mate mě taky to, že m:m relace není nahlížena symetricky, ale že si mám > vybrat jen jednu z těch dvou tabulek a do ní ManyToManyField přidat. > API pro výběr je (prý) sice stejné, ale v té druhé tabulce nebudu mít > příslušný widget. > Je to opravdu celkem symetrické (i když nevím, jak se to chová v adminu). Na druhé straně (tam, kde to nedefinuješ) si můžeš zvolit jméno atributu, přes který k tomu budeš přistupovat pomocí "related_name" v té definici (by default vznikne jméno xxxx_set). Dotazovat se pak můžeš buď z jedné strany, z druhé strany a nebo i z prostředka přes tu propojovací tabulku, jak jsem psal výše. > > Otázka tedy je: > Kterou variantu si mám vybrat a proč? > Jak už jsem zmínil - na jednoduché věci bez through na složitější s tím. Dá se to kdyžtak i časem změnit pomocí migrací, takže pokud to zatím nepotřebuješ a víš že brzy nebudeš, tak nemusíš ručně mezitabulku vytvářet jen spekulativně (i když i to jsem občas viděl). Jasný důvod pro mezitabulku jsou další navázané věci k té vazbě a případně zmíněná možnost efektivnějších bulk queries. > > Nejde mi o jednoduchý příklad HlavniTabulka>=<Tagy - to chápu, že tam se > hodí ta easy varianta bez through, > ale o složitější datová schémata s možností dlouhodobé udržitelnosti a > rozvoje (zesložitění schématu). > > Díky za případné nasměrování .... > > Snad jsem aspoň trochu pomohl. Beda > -- > -- > E-mailová skupina [email protected] > Správa: http://groups.google.cz/group/django-cs > --- > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny > „django-cs“ ve Skupinách Google. > Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, > zašlete e-mail na adresu [email protected]. > Chcete-li tuto diskusi zobrazit na webu, navštivte > https://groups.google.com/d/msgid/django-cs/a9155410-4dee- > 4a21-8313-fa5417fa7a12%40googlegroups.com > <https://groups.google.com/d/msgid/django-cs/a9155410-4dee-4a21-8313-fa5417fa7a12%40googlegroups.com?utm_medium=email&utm_source=footer> > . > Další možnosti najdete na https://groups.google.com/d/optout. > -- -- E-mailová skupina [email protected] Správa: http://groups.google.cz/group/django-cs --- Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google. Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu [email protected]. Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAAwiQbuWO3tgRFirnJkf6QwBYc2tDsit-XhwLoSf%3DYgFd3sHBg%40mail.gmail.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
