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.

Reply via email to