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=鈥榪uestion_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 鈥渄jango-extensions鈥, para el manejo del shell:

Instalar:

pip install django-extensions

Luego en el archivo 鈥渟ettings鈥 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 鈥渃hoices鈥 de una 鈥渜uestion鈥 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 = 鈥溌緾u谩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 = 鈥溌縌ui茅n es el mejor profesor鈥?)

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

we鈥檒l 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()