Pedro Mortensen
Hay esta línea en el tutorial de Django, Escribiendo tu primera aplicación Django, parte 1:
p.choice_set.create(choice="Not much", votes=0)
Como es choice_set
llamado a la existencia y lo que es?
supongo que el choice
parte es la versión en minúsculas del modelo Choice
utilizado en el tutorial, pero lo que es choice_set
? ¿Puedes elaborar?
ACTUALIZAR: Según la respuesta de Ben, localicé esta documentación: Siguiendo las relaciones “hacia atrás”.
ben james
Ha creado una clave externa en Choice
que relaciona cada uno con un Question
.
Entonces, cada uno Choice
explícitamente tiene un question
campo, que declaró en el modelo.
El ORM de Django sigue la relación hacia atrás desde Question
también, generando automáticamente un campo en cada instancia llamado foo_set
dónde Foo
es el modelo con ForeignKey
campo a ese modelo.
choice_set
es un RelatedManager
que puede crear conjuntos de consultas de Choice
objetos que se relacionan con el Question
ejemplo, por ejemplo q.choice_set.all()
Si no te gusta el foo_set
nombrando qué Django elige automáticamente, o si tiene más de una clave externa para el mismo modelo y necesita distinguirlas, puede elegir su propio nombre predominante usando el related_name
argumento a ForeignKey
.
-
Gracias. Sé mucho más ahora. ¿No es choice_set un “Administrador”? (que puede devolver una instancia de la clase QuerySet). ¿O es la misma cosa?
-Peter Mortensen
12 de enero de 2010 a las 12:41
-
Tienes razón, es un
RelatedManager
que puede crear conjuntos de consultas.– Ben James
12 de enero de 2010 a las 13:22
rs_punia
Aquí se hacen dos preguntas cruciales. Primero: Como es choice_set
llamado a la existencia. Segundo: ¿Qué es?
Para todos los nuevos desarrolladores como yo, permítanme describir cómo lo hice fácil para mí. Déjame responder primero a la segunda pregunta. “¿Qué es”, a través de estas 3 palabras? Instancia de modelo, conjunto de objetos relacionados con esa instancia, administrador_relacionado.
Modelos.py del tutorial de Django:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Instancia:
q = Question.objects.get(pk=3)
# Here q is an instance of model class 'Question'.
c = Choice.objects.get(pk=32)
# Here c is an instance of model class 'Choice'.
'Model Instance' is a single 'ROW' of an entire 'TABLE' of your database
Aquí el Question Model
se utiliza como un foreign key
hacia Choice Model
. Por lo tanto, todos los conjunto de objetos relacionados con la instancia q se puede filtrar usando:
q.choice_set.all()
Por lo tanto, choice_set
aquí está, todas las opciones relacionadas con la pregunta, que tiene pk=3.
Ahora, la respuesta a la primera pregunta necesita la tercera palabra Gerente relacionado. Documentación de Django aquí:-
Si un modelo tiene una clave externa, las instancias del modelo de clave externa tendrán acceso a un administrador que devuelve todas las instancias del primer modelo. De forma predeterminada, este Administrador se llama FOO_set, donde FOO es el nombre del modelo de origen, en minúsculas. Este Administrador devuelve QuerySets, que se pueden filtrar y manipular como se describe en la sección anterior “Recuperación de objetos”.
Esta palabra (choice_set) se puede cambiar usando el parámetro ‘related_name’ en Foreign_key.
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="choices")
Para relación hacia atrás a través de clave externa:
q.choice_set.all()
# If using related_name, then it is same as
q.choices.all()
# All the choices related to the instance q.
Para relación directa:
choice_qs = Choice.objects.all()
choice_qs.filter(question=q)
# Same result as above. All the choices related to instance q.
Debería haberme vinculado a esa documentación, es más claro que mi respuesta.
– Ben James
12 de enero de 2010 a las 13:22
@Ben James: no, agradezco que se haya formulado de otra manera, especialmente la elaboración de lo que está haciendo el ORM. La documentación de Django puede ser concisa a veces.
-Peter Mortensen
12 de enero de 2010 a las 15:06
Gracias por preguntar esto, estaba confundido porque no lo explican en el tutorial.
– claudio
30 de marzo de 2013 a las 5:40
Wow, esa es una línea de código cargada para un novato. Para mí, el obstáculo fue comprender que estamos obteniendo un objeto de elección, relacionado con la pregunta, para luego incrementar sus votos de elección en uno. El concepto de RelatedManager no se ha mencionado en el tutorial hasta este momento, por lo que puede ser un verdadero escollo.
– congelado jim
06/08/2015 a las 15:40
@HemantKumar Intenté corregir los documentos pero no me aprobaron. Si encuentra el mismo problema, no dude en comentarlo en PR: github.com/django/django/pull/13330
– Escachator
20 de agosto de 2020 a las 16:57