Contenidos

La consola interactiva de Django

En este módulo estaremos conociendo una característica de Django que permite hacer cosas de forma más sencilla, pero no profundizaremos, porque es algo complejo.

Así como Python tiene una consola que permite ejecutar código sin necesidad de crear archivos, sino simplemente escribiendo y ejecutando directamente en la consola, Django también tiene una característica similar.

# Activar consola interactiva de Django en Windows
py manage.py shell
# Activar consola interactiva de Django en Linux/Mac
py manage.py shell

Activar la consola interactiva de Django permite ejecutar código con los archivos del proyecto, es decir que podemos acceder y manipular el proyecto con comandos de Python, de esta forma podemos interactuar con las clases de los modelos, por ejemplo.

Así podemos crear un objeto de la clase Question y como esta clase hereda de Model cuenta con métodos que permiten comunicarse con base de datos a través del ORM. Con save() guardamos el objeto como registro en la base de datos:

Untitled

El método str

Podemos consultar las Question y Choice que existen a través del ORM, que accedemos con su atributo objects, y de objects utilizamos el método all(). Actualmente la representación de los objetos Question y Choice al imprimirlos en consola no es muy entendible.

Untitled

Para modificar la forma en que se representan estas clases Question y Choice, podemos sobrescribir el comportamiento del método str, el cual existe para todas las clases y es invocado cuando se requiere representar un objeto de la clase en forma de string, como puede ser al momento de imprimirlo en consola.

Vamos a hacer que al invocar el método str de los objetos de Question y Choice se retorne el texto que las describe.

# Archivo premiosPlatzi/polls/models.py
class Question(models.Model):
	...
	def __str__(self):
        return self.question_text

class Choice(models.Model):
	...
	def __str__(self):
        return self.choice_text

También agregaremos un método para saber si una pregunta se publicó recientemente, será útil más adelante. Para crear este método necesitaremos importar el módulo timezone de Django y timedelta de Python, el método retorna True si la fecha de publicación es menor a 1 día, de lo contrario retorna False:

...
from django.utils import timezone
import datetime

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

Si consultamos nuevamente los registros de Question en la base de datos, notaremos que la representación en consola es diferente

⚠️ Si tenías una consola Django abierta antes de definir los métodos, debes abrir una nueva para que tome en cuenta los cambios).

Untitled