¿Qué es choice_set en este tutorial de la aplicación Django?

144

Existe esta línea en el tutorial de Django, Escribiendo su primera aplicación Django, parte 1 :

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

¿Cómo se choice_setllama a la existencia y qué es?

Supongo que la choiceparte es la versión en minúsculas del modelo Choiceutilizado en el tutorial, pero ¿qué es choice_set? ¿Puedes elaborar?

ACTUALIZACIÓN: Basado en la respuesta de Ben , encontré esta documentación: Siguiendo las relaciones "hacia atrás" .

Peter Mortensen
fuente
Debería haber vinculado a esa documentación, es más clara que mi respuesta.
Ben James
@Ben James: no, agradezco que se formule de una manera diferente, especialmente la elaboración de lo que está haciendo el ORM. La documentación de Django puede ser breve a veces.
Peter Mortensen el
40
Gracias por preguntar esto, estaba confundido por esto ya que no lo explican en el tutorial.
claudio
44
Wow, esa es una línea de código cargada para un novato. Para mí, el obstáculo era comprender que estamos obteniendo un Objeto de Elección, relacionado con la Pregunta, para luego incrementar su elección. Votos en uno. El concepto de RelatedManager no se ha mencionado en el tutorial hasta este punto, por lo que puede ser un verdadero obstáculo.
frozenjim
@ PeterMortensen, ¿puede actualizar la documentación donde se describe? gracias
MH

Respuestas:

178

Creó una clave foránea en la Choiceque se relaciona cada una con a Question.

Entonces, cada uno Choicetiene explícitamente un questioncampo, que usted declaró en el modelo.

El ORM de Django también sigue la relación al revés Question, generando automáticamente un campo en cada instancia llamada foo_setdonde Fooestá el modelo con un ForeignKeycampo para ese modelo.

choice_setes un RelatedManagerque puede crear conjuntos de consultas de Choiceobjetos relacionados con la Questioninstancia, por ejemploq.choice_set.all()

Si no le gusta el foo_setnombre que Django elige automáticamente, o si tiene más de una clave foránea para el mismo modelo y necesita distinguirlos, puede elegir su propio nombre superior utilizando el related_nameargumento para ForeignKey.

Ben James
fuente
Gracias. Sé mucho más ahora. ¿Es choice_set un "Administrador"? (que puede devolver una instancia de la clase QuerySet). ¿O es la misma cosa?
Peter Mortensen el
2
Tienes razón, es una RelatedManagerque puede crear conjuntos de consultas.
Ben James