Co to jest choice_set w tym samouczku dotyczącym aplikacji Django?

144

Jest taka linia w samouczku Django, Pisanie pierwszej aplikacji Django, część 1 :

p.choice_set.create(choice='Not much', votes=0)

Jak jest choice_setpowołany do istnienia i co to jest?

Przypuszczam, że choiceczęść jest wersją modelu Choiceużywaną w tutorialu małymi literami , ale co to jest choice_set? Czy możesz rozwinąć?

AKTUALIZACJA: W oparciu o odpowiedź Bena , znalazłem tę dokumentację: Następujące relacje są „wsteczne” .

Peter Mortensen
źródło
Powinienem był po prostu połączyć się z tą dokumentacją, jest jaśniejsza niż moja odpowiedź.
Ben James,
@Ben James: nie, doceniam to, że zostało to sformułowane w inny sposób, zwłaszcza jeśli chodzi o omówienie tego, co robi ORM. Dokumentacja Django może być czasami zwięzła.
Peter Mortensen
40
Dziękuję za pytanie, byłem zdezorientowany, ponieważ nie wyjaśniają tego w samouczku.
Claudio
4
Wow, to załadowana linia kodu dla początkującego. Dla mnie przeszkodą było zrozumienie, że otrzymujemy obiekt wyboru powiązany z pytaniem, aby następnie zwiększyć jego wybór. Głosów o jeden. Koncepcja RelatedManager nie została do tej pory wspomniana w samouczku, więc może być prawdziwą przeszkodą.
frozenjim
@PeterMortensen czy możesz zaktualizować dokumentację, w której jest ona opisana? dziękuję
MH

Odpowiedzi:

178

Utworzyłeś klucz obcy, na Choicektórym każdy z nich jest powiązany z plikiem Question.

Tak więc każdy Choicejawnie ma questionpole, które zadeklarowałeś w modelu.

ORM Django również podąża za relacją wstecz Question, automatycznie generując zmienną w każdej instancji o nazwie foo_setgdzie Foojest modelem z ForeignKeypolem do tego modelu.

choice_setto narzędzie, RelatedManagerktóre może tworzyć zestawy zapytań Choiceobiektów, które odnoszą się do Questioninstancji, npq.choice_set.all()

Jeśli nie podoba ci się foo_setnazewnictwo, które Django wybiera automatycznie lub jeśli masz więcej niż jeden klucz obcy do tego samego modelu i chcesz je rozróżnić, możesz wybrać własną nazwę nadpisującą, używając related_nameargumentu do ForeignKey.

Ben James
źródło
Dzięki. Teraz wiem znacznie więcej. Czy choice_set nie jest „menedżerem”? (która może zwrócić wystąpienie klasy QuerySet). Czy to jest to samo?
Peter Mortensen
2
Masz rację, to narzędzie RelatedManagermoże tworzyć zestawy zapytań.
Ben James,