Qu'est-ce que choice_set dans ce didacticiel d'application Django?

144

Il y a cette ligne dans le tutoriel Django, Écrire votre première application Django, partie 1 :

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

Comment est choice_setappelé à l'existence et qu'est-ce que c'est?

Je suppose que la choicepartie est la version minuscule du modèle Choiceutilisé dans le didacticiel, mais qu'est-ce que c'est choice_set? Peux-tu élaborer?

MISE À JOUR: Sur la base de la réponse de Ben , j'ai localisé cette documentation: Suite aux relations «en arrière» .

Peter Mortensen
la source
J'aurais dû me connecter à cette documentation, c'est plus clair que ma réponse.
Ben James
@Ben James: non, j'apprécie de l'avoir formulé d'une manière différente, en particulier l'élaboration de ce que fait l'ORM. La documentation Django peut parfois être concise.
Peter Mortensen
40
Merci d'avoir posé cette question, j'ai été confus par cela car ils ne l'expliquent pas dans le tutoriel.
claudio
4
Wow, c'est une ligne de code chargée pour un débutant. Pour moi, l'obstacle était de comprendre que nous obtenions un objet de choix, lié à la question, afin d'incrémenter ensuite son choix.votes par un. Le concept RelatedManager n'a pas été mentionné dans le tutoriel à ce stade, il peut donc être une véritable pierre d'achoppement.
Frozenjim
@PeterMortensen pouvez-vous mettre à jour la documentation là où elle est décrite? merci
MH

Réponses:

178

Vous avez créé une clé étrangère sur Choicelaquelle relie chacun à un fichier Question.

Ainsi, chacun a Choiceexplicitement un questionchamp, que vous avez déclaré dans le modèle.

L'ORM de Django suit la relation à rebours Question, générant automatiquement un champ sur chaque instance appelée foo_setFooest le modèle avec un ForeignKeychamp vers ce modèle.

choice_setest un RelatedManagerqui peut créer des ensembles de requêtes d' Choiceobjets qui se rapportent à l' Questioninstance, par exempleq.choice_set.all()

Si vous n'aimez pas la foo_setdénomination que Django choisit automatiquement, ou si vous avez plus d'une clé étrangère pour le même modèle et avez besoin de les distinguer, vous pouvez choisir votre propre nom de substitution en utilisant l' related_nameargument to ForeignKey.

Ben James
la source
Merci. J'en sais beaucoup plus maintenant. Choice_set n'est-il pas un "Manager"? (qui peut renvoyer une instance de la classe QuerySet). Ou est-ce la même chose?
Peter Mortensen
2
Vous avez raison, c'est un RelatedManagerqui peut créer des ensembles de requêtes.
Ben James