Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso Básico de Django

Curso Básico de Django

Facundo García Martoni

Facundo García Martoni

Accediendo al conjunto de respuestas

16/29
Recursos

Aportes 10

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Otra opción sería asignar un nombre con el que te sea fácil identificar la relación inversa, usando related_name en el atributo question en el modelo Choice.

question= models.ForeignKey(Question, on_delete=models.CASCADE, related_name=‘question_choices’)

De esa forma estaríamos especificando el nombre con el que queremos llamar a la relación inversa y podríamos usar:
q.question_choices.all()
en lugar de q.choice_set.all()

Si nosotros no especificamos el nombre de la relación inversa usando related_name Django crea uno automáticamente usando el nombre del modelo con el sufijo _set. (choice_set)

Es un poco peculiar que Django en ciertas cosas use el doble underscore (__) en vez del dot notation pero básicamente tiene la misma función.

Cuando un modelo tiene definido un valor por defecto como votes en choices no es necesario definir ese valor en su creación

Las formas de crear una Choice (Explicación):


Cuando una clase/tabla Choice tiene una llave foranea hacia una clase/tabla Question, existen 2 formas de crear las “choices” de una “question” especifica.
.

  1. La primera forma es crear la choice desde su clase, referenciando referenciando el objeto exacto de la question a la que pertenece. Es decir:

    #Primero encontramos el objeto de la question a la que le queremos añadir la choice.
    my_question = Question.objects.get(pk=1)
    
    #Luego le pasamos ese objeto a la choice.
    my_choice = Choice(
    	question_id = my_question,
    	choice_text = "text of my choice"
    )
    #OJO: Como dice un compañero, el argumento "votes" no es necesario pasarlo pues ya 	definimos en el modelo de Choice que tendrá un valor predeterminado de 0
    
    my_choice.save() # Si lo hacemos con esta tecnica es necesario guardar para que los 	cambios se hagan en la db.
    
  2. La segunda forma es la que enseñó el profesor, en teoria consiste en que django tiene una API que nos ayuda a encontrar todas las clases que tienen una relación por llave foranea hacia nuestra clase/tabla X (Es decir, en este caso nosotros podemos acceder a todas las clases conectadas por llave foranea a nuestra clase Question , que en este caso solo tenemos la clase Choice pero podrían ser más)

    He creado una clase igual a Choice pero llamada OptionalChoice y puedo crear sus objetos de la misma forma en la que el profesor lo hace en el video con la clase Choice, así:

    my_question = Question.objects.get(pk=1) #Objeto de la question
    my_question.optionalquestion_set.create(choice_text = "text of my optional choice")
    #Recordar que con esta forma de hacer las cosas no es necesario usar el método save().
    

lo admito, vi la clase 2 veces.

  • Filtrando las Choice que tiene como Question(FK) al año actual:

Choice.objects.filter(question__pub_date__year=timezone.now().year)

Esto me recuerda mucho a Laravel.

No tengo mucha experiencia con este framework de php pero hasta ahora estoy captando que funcionan muy identicos

Me sale este error
no such table polls_choice
PLatz8i de momento no me deja de subir imagenes

Algo con lo que luché al inicio fue el cómo crear instancias en la base de datos. En las últimas clases se han descrito 2, entre las que me confundía mucho al inicio:

  • El método contructor, en el que se llama la clase y se pasa como aprámetros los atributos para esa clase. Si usamos esa forma de crear instasncias, es importante usar el método save() para guardarlas en la base de datos
    p.e:
    #instanciar el objeto
    q = Question(question_text = “¿Cuál es el mejor profesor?”)
    #guardar la instancia en la BDD
    q.save()
  • El método create de Clase.objects, el cual crea directamente la isntancia y la guarda en la base de datos.
    p.e:
    #se instancia el objeto y se guarda en la BDD, todo en el mismo comando
    q = Question.objects.create(question_text = “¿Quién es el mejor profesor”?)

we’ll create the options of answer of a question

In [37]: q = Question.objects.get(pk=1)

In [38]: q
Out[38]: <Question: ¿Cuál es el mejor curso de Platzi?>

In [39]: q.choice_set.all()
Out[39]: <QuerySet []> # here we'll see the set of answers

#creating the choices for the question
In [43]: q.choice_set.create(choice_text="Curso Básico de Python", votes=0)
Out[43]: <Choice: Curso Básico de Python>

In [44]: q.choice_set.create(choice_text="Fundamentos de Ingeniería de Software", votes=0)
Out[44]: <Choice: Fundamentos de Ingeniería de Software>

In [45]: q.choice_set.create(choice_text="Gestión Efectiva del Tiempo", votes=0)
Out[45]: <Choice: Gestión Efectiva del Tiempo>

# Set of choices of the question
In [46]: q.choice_set.all()
Out[46]: <QuerySet [<Choice: Curso Básico de Python>, <Choice: Fundamentos de Ingeniería de Software>, <Choice: Gestión Efectiva del Tiempo>]>

# Counting the choices of the question
In [47]: q.choice_set.count()
Out[47]: 3

# Query of Choices with a question publication date equal to the current year
In [49]: Choice.objects.filter(question__pub_date__year=timezone.now().year)
Out[49]: <QuerySet [<Choice: Curso Básico de Python>, <Choice: Fundamentos de Ingeniería de Software>, <Choice: Gestión Efectiva del Tiempo>]>