Was ist choice_set in diesem Django-App-Tutorial?

144

Es gibt diese Zeile im Django-Tutorial, Schreiben Ihrer ersten Django-App, Teil 1 :

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

Wie wird es choice_setins Leben gerufen und was ist es?

Ich nehme an, der choiceTeil ist die Kleinbuchstabenversion des Choiceim Tutorial verwendeten Modells , aber was ist das choice_set? Können Sie das näher erläutern?

UPDATE: Basierend auf Bens Antwort habe ich diese Dokumentation gefunden: Folgende Beziehungen "rückwärts" .

Peter Mortensen
quelle
Ich hätte nur auf diese Dokumentation verlinken sollen, sie ist klarer als meine Antwort.
Ben James
@ Ben James: Nein, ich schätze es, dass es anders formuliert wurde, insbesondere die Ausarbeitung dessen, was das ORM tut. Die Django-Dokumentation kann manchmal knapp sein.
Peter Mortensen
40
Vielen Dank, dass Sie dies gefragt haben. Ich war verwirrt, da sie es im Tutorial nicht erklären.
Claudio
4
Wow, das ist eine geladene Codezeile für einen Neuling. Für mich bestand die Hürde darin, zu verstehen, dass wir ein Auswahlobjekt erhalten, das sich auf die Frage bezieht, um dann die Auswahl zu erhöhen. Stimmen um eins. Das RelatedManager-Konzept wurde im Tutorial bisher nicht erwähnt, sodass es ein echter Stolperstein sein kann.
Frozenjim
@PeterMortensen können Sie bitte die Dokumentation dort aktualisieren, wo sie beschrieben ist? Vielen Dank
MH

Antworten:

178

Sie haben einen Fremdschlüssel erstellt, Choiceder sich jeweils auf a bezieht Question.

Jedes hat also Choiceexplizit ein questionFeld, das Sie im Modell deklariert haben.

Djangos ORM folgt die Beziehung rückwärts von Questionebenfalls automatisch ein Feld für jede Instanz zu erzeugen genannt , foo_setwo Foodas Modell ist mit einem ForeignKeyFeld in dieses Modell.

choice_setist eine, RelatedManagerdie Abfragesätze von ChoiceObjekten erstellen kann, die sich auf die QuestionInstanz beziehen , zq.choice_set.all()

Wenn Ihnen foo_setdie von Django automatisch ausgewählte Benennung nicht gefällt oder wenn Sie mehr als einen Fremdschlüssel für dasselbe Modell haben und diese unterscheiden müssen, können Sie mit dem related_nameArgument to Ihren eigenen übergeordneten Namen auswählen ForeignKey.

Ben James
quelle
Vielen Dank. Ich weiß jetzt viel mehr. Ist choice_set nicht ein "Manager"? (das kann eine Instanz der Klasse QuerySet zurückgeben). Oder ist es dasselbe?
Peter Mortensen
2
Sie haben RelatedManagerRecht , es ist eine, die Abfragesätze erstellen kann.
Ben James