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

Filtrando los objetos creados desde la consola interactiva

14/29
Recursos

Aportes 14

Preguntas 2

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Para no olvidar del método get:

Model.objects.get(condición) --> solo retorna 1 objeto

Para evitar estar colocando la fecha en la pregunta se puede definir auto_now=True como valor por defecto en el campo de tipo datetime

Puede que les vaya a aparecer un error que dice django.db.utils.OperationalError: no such table: cuando traten de crear la Question, eso se debe a que se puede buguear la migration, para solucionarlo, borren la base de datos, borren los archivos adentro de la carpeta pycache tanto de premiosplatziapp como de polls, eliminan todas las migraciones al interior de migrations, una vez eliminados todos esos archivos proceden a realizar en consola py manage.py makemigrations y después py manage.py migrate, con eso tendrán solucionado el error, un saludo.

Para usar el get con dia, mes o año:

get(pub_date__year=timezone.now().year)
get(pub_date__year=timezone.now().month)
get(pub_date__year=timezone.now().day)

Para usar con filter:
__lte -> Less than or equal
__gte -> Greater than or equal
__lt -> Less than
__gt -> Greater than

Questions.objects.filter( pub_time__lte = (timezone.now() - timedelta(hours=12) ) )

Para el método get hay que ser muy especifico, ya que solo trae uno, por el ejemplo estableciendo de filtro la “pk”, para traer datos con cierta condición es mejor usar filter y exclude para tenerlo más preciso.

Para saber mas sobre las búsquedas en los queries, les dejo la documentación en el apartado que explican esto a detalle
https://docs.djangoproject.com/en/4.0/topics/db/queries/#retrieving-specific-objects-with-filters

Otra forma de escribir la clase Question para que agregue automaticamente la fecha de publicacion.

<class Question(models.Model):
    # Dentro de la clase definimos los atributos que son las columnas de la tabla
    id
    question_text = models.CharField(max_length=200)
    pub_date = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1> 

Excelente

protip: Para limpiar la terminal en Python desde Windows, escribe:

>>> import os
>>> os.system('cls')

protip: Usando __ en los atributos, Django nos permite hacer búsquedas más complejas sobre los datos.

Siguiente clase, método Filter.

Podría ser también con unos cuantos enters… cls

El doble guión bajo “__” en consultar ORM Django sirve para acceder a atributos o métodos de una clase. Por ejemplo

Model.object.get(pudb_date__year=timezon.now)

Si necesitan algo más gráfico para administrar su pequeño archivo sqlite3 en Ubuntu pueden seguir esta corta guía!

https://linuxhint.com/install-sqlite-ubuntu-linux-mint/

Database

Es importante diferenciar el get y el filter. En el trabajo me pasó que usar uno u otro resultaba en un bug. Les explico: Filter nos va a traer una respuesta siempre (aunque sea un QuerySet vacio, o múltiples instancias del modelo), mientras que get o nos traera el objeto (en caso de que exista) o nos traera un error (el visto en la clase Does not exist). Dependiendo de la funcionalidad que quieras implementar, te convendrá usar una u otra pero es importante tenerlo en cuenta.

Un ejemplo de como filtrar las preguntas que hayan sido creadas doce o mas horas antes que el timestamp actual.

from datetime import timedelta

from django.utils import timezone

Questions.objects.filter( pub_time__lte = (timezone.now() - timedelta(hours=12) ) )