Obojí možnosti ManyToManyField, jak s through=... tak i bez něho, jsou
zcela kompatibilní. Pokud bude k nějakému účelu užitečné se odvolávat na
vazební tabulku, lze se k umělému modelu dostat pomocí Model._meta API
<https://docs.djangoproject.com/en/2.0/ref/models/meta/#model-meta-field-api>
.
Příklad: Někdo má modely Group a Permission. V modelu Permission je pole
"groups". Pokud se potřebuji odvolat na vnitřní model vazební tabullky,
mohu si uložit na něj referenci, abych nepsal dlouhé výrazy a zároveň si
jej srozumitelně pojmenovat např. "GroupPermissions":
GroupPermissions = Permission._meta.get_field('group').through
Nemusí se sahat na model, toto lze narychlo dodělat třeba uvnitř models.py
nebo jednoho view nebo vyzkoušet na příkazové řádce manage.py shell. Chová
se to, jako by explicitní "through=..." existovalo už od nepaměti. Změna
nezpůsobí žádnou migraci ani zásah do jiného kódu.
Není mi znám žádný případ, kde by v posledních verzích Djanga bylo potřeba
se v dotazu odvolávat na explicitní triviální vazební tabulku, ale uznávám,
že je to s ní více intuitivní zápis. Myslí si snad někdo, že zná
protipříklad, abych to na něm měl ukázat? V minulých letech byla vazební
tabulka potřeba pro některé dotazy a ze setrvačnosti jsem pokračoval, ale
letos jsem se to naučil i bez ní.
Je ohromně užitečné, že obě relace se zapisují asymetricky jen na jedné
straně. Například model User nebo Person bývá použitý v mnoha projektech. K
němu se může vztahovat několik aplikací a vždycky se použijí jen vybrané
potřebné. Bylo by nežádoucí, kdyby všeobecný model musel zaviset na mnoha
jednoúčelových modelech.
Pokud se k vazební tabulce časem přidá pole, dá se to jednoduše udělat tak,
aby se tím v rámci migrace přidalo jen to pole, ačkoli byl dopsán nový
explicitní vazební model. Všiml sis, že jsem si troufl pojmenovat odkaz na
model anglicky srozumitelněji "GroupPermissions"? Raději pak použiji
parametr `db_table='permission_group'`, než abych lámal slovosled na
neanglické "PermissionGroup". Zkrátka lze bez obav plynule navázat ve dvou
krocích, podle toho, jak košatý model je momentálně potřeba.
--
--
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/af938750-9d4f-48d2-8668-6153bddcc1ec%40googlegroups.com.
Další možnosti najdete na adrese https://groups.google.com/d/optout.