No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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 21

Preguntas 8

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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)

Una herramienta bastante útil es “django-extensions”, para el manejo del shell:

Instalar:

pip install django-extensions

Luego en el archivo “settings” del proyecto incluir:

INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)

y luego ejecutar el comando:

python3 manage.py shell_plus

Ahora la consola permite autocompletar y también importa los modelos de forma automática.

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.

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().
    

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

lo admito, vi la clase 2 veces.

Recordatorio:
Si cerraste la consolta anteriormente y empiezas está clase abriendo todo de nuevo, recuerda ejecutar:

from polls.models import Question, Choice

Antes de ejecutar lo que hace el profesor

Accediendo al conjunto de respuestas

>>> q = Question.objects.get(pk=1)
>>> q
<Question: ¿Cuál es el mejor curso de Platzi?>
>>> q.choice_set.all()
<QuerySet []>
>>> q.choice_set.create(choice_text="Curso Básico de Python", votes=0)
<Choice: Curso Básico de Python>
>>> q.choice_set.create(choice_text="Curso de Fundamentos de Ingeniería de Software", votes=0)
<Choice: Curso de Fundamentos de Ingeniería de Software>
>>> q.choice_set.create(choice_text="Curso de Elixir", votes=0)
<Choice: Curso de Elixir>
>>> q.choice_set.all()
<QuerySet [<Choice: Curso Básico de Python>, <Choice: Curso de Fundamentos de Ingeniería de Software>, <Choice: Curso de Elixir>]>
>>> q.choice_set.count()
3
>>> Choice.objects.filter(question__pub_date__year=timezone.now().year)
<QuerySet [<Choice: Curso Básico de Python>, <Choice: Curso de Fundamentos de Ingeniería de Software>, <Choice: Curso de Elixir>]>
>>>
  • Filtrando las Choice que tiene como Question(FK) al año actual:

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

Que fundamental que fue aprender poo y bases de datos. Me quedo claro todo lo dicho por el profe Facundo.

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”?)

Entre más profundizo en Django, más me gusta FastAPI

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>]> 

Esto me recuerda mucho a Laravel.

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

para la fecha de hoy mas de 5 meses despues el curso le falta 14 días para el curso elixir

Me ha salido bien todo

Poder acceder a un set de datos relacionados

q = Question.objects.get(pk=1)

# obtener todos los datos relacionados.
q.choice_set.all()

Al declarar Votes el modelo con votes = models.IntegerField(default=0) No es necesario agregarlo en el create a menos que quieras darle un valor superior a zero

Muy buena esta clase

En caso de usar filter en lugar de get:
q = Question.objects.filter(pk=1)
q[0].choice_all()