DJANGO - USAR MODELOS DE MANERA INTERACTIVA

En esta sesión utilizamos la shell interactiva de Python provista por Django para demostrar el uso de los Modelos de datos definidos con el ORM, y sus operaciones más comunes, incluyendo cómo realizar consultas, filtros, crear y modificar objetos almacenados en la base de datos.

Cargando video...

NOTA: Solo puedes ver una versión limitada del video a baja resolución, si quieres ver la versión completa por favor regístrate y obtén alguno de nuestros planes!

Descripción del Vídeo

Luego de definir los modelos y aplicar los cambios requeridos en la BD, ya disponemos de una API en Python para acceder a los objetos de BD. Antes de utilizarlos en otros componentes de nuestra aplicación web, exploraremos su uso en una sesión interactiva de línea de comandos para nuestro proyecto:
python manage.py shell

Dentro de la sesión interactiva, podemos importar las clases que queramos de nuestro proyecto (en este caso, los modelos) y explorar su estructura, usándolos de manera similar a como lo haría nuestra aplicación. Esto es una buena forma de familiarizarnos con los objetos de BD que nos brinda el ORM de Django.

Código de modificaciones disponible en:
https://github.com/networkfaculty/Fundamentos-Django/releases/tag/d-2.1.5


>>> from encuestas.models import Pregunta, Opcion
>>> Pregunta.objects.all()
[]
>>> from django.utils import timezone
>>> p = Pregunta(texto_pregunta="¿Cuál es la respuesta de la vida, el universo y todo lo demás?",fe_publicacion=timezone.now())
>>> p

>>> p.texto_pregunta
'¿Cuál es la respuesta de la vida, el universo y todo lo demás?'
>>> p.fe_publicacion
datetime.datetime(2015, 10, 18, 0, 51, 12, 305470, tzinfo=)
>>> p.id
>>> p.save()
>>> p.id
1
>>> p.texto_pregunta = "¿Cuál es la respuesta a la vida, el universo y todo lo demás?"
>>> p.save()
>>> Pregunta.objects.all()
[]
>>>
# El objeto 'Pregunta' no nos dice nada útil. Podemos agregar el método __str__ a la clase modelo para brindar una representación más útil.
# Podemos agregar nuestros propios métodos en las clases modelo. Son clases de Python :)
# Cambios realizados:

models.py

from django.db import models
from django.utils import timezone
import datetime
class Pregunta(models.Model):
texto_pregunta = models.CharField(max_length=200)
fe_publicacion = models.DateTimeField('Fecha de Publicación')
def __str__(self):
return self.texto_pregunta
def publicada_recientemente(self, dias=1):
return self.fe_publicacion >= timezone.now() - datetime.timedelta(days=dias)
class Opcion(models.Model):
pregunta = models.ForeignKey(Pregunta)
texto_opcion = models.CharField(max_length=200)
votos = models.IntegerField(default=0)
def __str__(self):
return self.texto_opcion
# Iniciar nueva sesión interactiva y usar modelos modificados
>>> from encuestas.models import Pregunta, Opcion
>>> from django.utils import timezone
>>> Pregunta.objects.all()
[]
>>> Pregunta.objects.filter(id=1)
[]
>>> Pregunta.objects.filter(texto_pregunta__startswith="¿Cuál")
[]
>>> año_actual = timezone.now().year
>>> año_actual
2015
>>> Pregunta.objects.filter(fe_publicacion__year = año_actual)
[]
>>> Pregunta.objects.filter(id=2)
[]
>>> Pregunta.objects.get(id=2)
Traceback (most recent call last):
File "/home/jparedes/.pyenv/versions/curso-python-3.5.0/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 69, in handle
self.run_shell(shell=options['interface'])
File "/home/jparedes/.pyenv/versions/curso-python-3.5.0/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 61, in run_shell
raise ImportError
ImportError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "", line 1, in 
File "/home/jparedes/.pyenv/versions/curso-python-3.5.0/lib/python3.5/site-packages/django/db/models/manager.py", line 127, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/jparedes/.pyenv/versions/curso-python-3.5.0/lib/python3.5/site-packages/django/db/models/query.py", line 334, in get
self.model._meta.object_name
encuestas.models.DoesNotExist: Pregunta matching query does not exist.
>>> p = Pregunta.objects.get(id=1)
>>> p.publicada_recientemente()
True
>>> p.opcion_set.all()
[]
>>> p.opcion_set.create(texto_opcion="No sé",votos=0)

>>> p.opcion_set.create(texto_opcion="¡Es imposible de responder!",votos=0)

>>> p.opcion_set.create(texto_opcion="42",votos=0)

>>> p.opcion_set.all()
[, , ]
>>> op = p.opcion_set.create(texto_opcion="Python",votos=0)
>>> op

>>> op.id
4
>>> op.pregunta

>>> p.opcion_set.all()
[, , , ]
>>> p.opcion_set.count()
4
>>> Opcion.objects.filter(pregunta__fe_publicacion__year = año_actual)
[, , , ]
>>> opciones = p.opcion_set.filter(texto_opcion__startswith = '¡')
>>> opciones
[]
>>> opciones.delete()
>>> p.opcion_set.all()
[, , ]

Rating

Global

Ver video en playlist

comments powered by Disqus

Headshot of Juan Paredes

Juan Paredes

Ingeniero de Sistemas con amplia experiencia, especializado en el desarrollo y arquitectura de software.