Los modelos de django
Publicado en Python el 27 de November, 2009 por Fran.En el anterior post de introducción a django, no se usaron bases de datos, así que en este se verá cómo trabaja django con las bases de datos, es algo realmente sencillo.
Los modelos
Al basarse django en el MVC, divide la aplicación en dos partes la vista (que ya se pudo ver en el anterior post) y el modelo. El modelo define los datos que utilizará la aplicación, como podrían ser los datos de un usuario (nombre, apellidos, dirección, …).
En el caso de django, los modelos serán clases de python que heredarán la clase Model y que utilizarán unos tipos de datos especiales para definir sus atributos. Más tarde, django, gracias a su ORM, transformará estas clases en tablas de la base de datos del proyecto.
Creando un modelo
Los modelos se definen en el archivo «models.py» de la aplicación de django que los vaya a utilizar. Cada modelo será una clase de python que heredará la clase django.db.models.Model, los atributos de las clases de cada modelo deberán ser instancias de unas clases que ofrece django para poder traducir estos atributos en campos de las tablas de la base de datos. Por ejemplo, para crear el modelo de un usuario:
# models.py
# -*- coding: utf-8 -*-
from django.db import models
class Usuario (models.Model):
"""Datos del usuario utilizados en la aplicación."""
nombre = models.CharField (max_length=40)
apellidos = models.CharField (max_length=60)
email = models.EmailField (unique=True)
def __unicode__ (self):
return '%s %s (%s)' % (self.nombre, self.apellidos, self.email)
Una breve explicación sobre el ejemplo anterior:
- Los atributos
nombreyapellidosserán dos campos de texto con una longitud máxima de 40 y de 60 caracteres respectivamente en la base de datos. - El atributo
emailserá un campo de texto cuyo valor deberá ser único y que además sólo aceptará direcciones de correo electrónico bien formadas. - El método
__unicode__es el equivalente a__str__en python, es decir, se usará cuando se quiera mostrar una instancia de la clase como una cadena de caracteres.
Para conocer los tipos existentes para los atributos de los modelos, siempre se puede consultar la lista de los tipos de los modelos de django.
Una vez se tengan los modelos creados, se deberán sincronizar con la base de datos utilizada.
Configurando la base de datos
Configurar la base de datos a utilizar en django es muy sencillo, sólo hay que editar el archivo «settings.py» del proyecto. Concretamente las siguientes variables:
DATABASE_ENGINEindica el gestor de base de datos utilizado, actualmente django sólo dispone de los siguientes módulos: postgresql_psycopg2, postgresql, mysql, sqlite3 u oracle.DATABASE_NAMEindica el nombre de la base de datos, menos en el caso de sqlite3 que indica la ruta al archivo de la base de datos.DATABASE_USERindica el usuario con acceso a la base de datos anterior.DATABASE_PASSWORDindica la contraseña del usuario anterior.DATABASE_HOSTindica la dirección del servidor de la base de datos, se debe dejar vacío para la máquina local.DATABASE_PORTindica el puerto del servidor de la base de datos, se debe dejar vacío para usar el puerto predeterminado.
Aviso: El usuario, la contraseña, la dirección y el puerto del servidor no se usan con sqlite3, ya que no son necesarios.
Una vez configurada la base de datos y creados los modelos necesarios, se podrá sincronizar los modelos de las aplicaciones del proyecto con la base de datos, sólo hay que ejecutar:
$ python manage.py syncdb
Nota: Hay que recordar que las aplicaciones del proyecto aparecen en la variable INSTALLED_APPS del archivo «settings.py», yo recomendaría (para estos ejemplos) quitar o comentar las que vienen de manera predeterminada.
Trabajando con la base de datos
Esta es una de las mejores cosas que tiene django, y es que para acceder (ya sea para consultar, insertar, actualizar o borrar una entrada) a la base de datos, gracias al ORM sólo se usan las clases definidas como modelos.
Para probar todo lo que se va a explicar sin tener que crearse vistas (que todavía no se han explicado en profundidad) siempre se puede ejecutar la consola de django:
$ python manage.py shell
Insertar, actualizar y borrar entradas
Tomando como ejemplo la clase Usuario anterior, se podría realizar:
from proyecto.aplicación.models import Usuario
# Insertar un nuevo usuario
usuario = Usuario (nombre='Pepe', apellidos='Garcia',
email='pepe@garcia.es')
usuario.save ()
# Actualizar los datos del usuario
usuario.nombre = 'Jose'
usuario.save ()
# Borrar el usuario
usuario.delete ()
Como se puede ver es tan sencillo como trabajar con cualquier clase de python.
Los «QuerySets»
Los «QuerySets» son conjuntos de objetos de la base de datos, es decir, los resultados de una consulta a la base de datos en forma de objetos de python.
Las clases de los modelos disponen de una instancia del gestor de objetos de la base de datos Clase.objects, en esta instancia se definen los diferentes métodos para realizar las consultas sobre la base de datos, que devolverán un «QuerySet» que contendrá los resultados.
De este modo, tomando el ejemplo de la clase Usuario:
from proyecto.aplicación.models import Usuario
# Insertar varios usuarios
usuario = Usuario (nombre='Pepe', apellidos='Garcia',
email='pepe@garcia.es')
usuario.save ()
usuario = Usuario (nombre='Maruja', apellidos='Perez',
email='maruja@perez.es')
usuario.save ()
usuario = Usuario (nombre='Pedro', apellidos='Garcia',
email='pedro@garcia.es')
usuario.save ()
# Conseguir todas las entradas de la base de datos
todos_los_usuarios = Usuario.objects.all ()
print 'Todos los usuarios %s' % todos_los_usuarios
# Conseguir los usuarios que se apelliden Garcia
garcias = Usuario.objects.filter (apellidos='Garcia')
print 'La familia Garcia %s' % garcias
# La familia Garcia ordenada por nombre
print 'La familia Garcia ordenada por nombre %s' % garcias.order_by ('name')
Como siempre esto no es más que una mota de polvo de lo que en realidad se puede hacer, para profundizar lo mejor es consultar la documentación de django sobre los «QuerySets».