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

4 minutos de lectura

avatar de usuario
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”.

  • 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

avatar de usuario
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

avatar de usuario
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.

¿Ha sido útil esta solución?