Что такое choice_set в этом руководстве по приложению Django?

149

В учебнике Django, Написание вашего первого приложения Django, часть 1, есть такая строка :

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

Как возникает choice_setи что это такое?

Я полагаю, что choiceэто строчная версия модели, Choiceиспользуемой в учебнике, но что choice_set? Вы можете уточнить?

ОБНОВЛЕНИЕ: Основываясь на ответе Бена , я обнаружил эту документацию: « Следуя обратным отношениям» .

Питер Мортенсен
источник
Я должен был просто сослаться на эту документацию, это яснее, чем мой ответ.
Бен Джеймс
1
@ Бен Джеймс: нет, я благодарен за то, что это сформулировано по-другому, особенно за то, что делает ORM. Документация Django иногда бывает краткой.
Питер Мортенсен
43
Спасибо, что спросили об этом, меня это смутило, так как они не объясняют это в учебнике.
Клаудио
4
Ух ты, это загруженная строка кода для новичка. Для меня препятствием было понимание того, что мы получаем объект выбора, связанный с вопросом, чтобы затем увеличить его choice.votes на единицу. Концепция RelatedManager до сих пор не упоминалась в руководстве, поэтому она может стать настоящим камнем преткновения.
Frozenjim 06
2
@HemantKumar Я пытался исправить документы, но не получил одобрения. Если вы обнаружите ту же проблему, не стесняйтесь комментировать в PR: github.com/django/django/pull/13330
Escachator

Ответы:

186

Вы создали внешний ключ, по Choiceкоторому каждый из них связан с файлом Question.

Итак, у каждого Choiceявно есть questionполе, которое вы объявили в модели.

ORM Django также следует за отношениями в обратном направлении Question, автоматически генерируя поле для каждого экземпляра, вызываемого, foo_setгде Fooмодель с ForeignKeyполем для этой модели.

choice_set- это объект, RelatedManagerкоторый может создавать наборы запросов Choiceобъектов, относящихся к Questionэкземпляру, напримерq.choice_set.all()

Если вам не нравится foo_setименование, которое Django выбирает автоматически, или если у вас более одного внешнего ключа для одной и той же модели и вам нужно их различать, вы можете выбрать свое собственное переопределяющее имя, используя related_nameаргумент to ForeignKey.

Бен Джеймс
источник
Спасибо. Теперь я знаю гораздо больше. Разве selection_set не является «менеджером»? (который может возвращать экземпляр класса QuerySet). Или это одно и то же?
Питер Мортенсен
2
Вы правы, он RelatedManagerможет создавать наборы запросов.
Бен Джеймс