El Modelo

Un modelo es la representación de los datos de nuestra aplicación. Contiene los campos básicos y el comportamiento de los datos que serán almacenados. Por lo general, cada modelo se convierte en una tabla de la base de datos.

Lo fundamental

  • Cada modelo es una subclase de django.db.models.Model.
  • Cada atributo de un modelo representa a un campo de una tabla.
  • Django automáticamente nos da acceso a la base de datos.

Referencia de los campos

La referencia de la versión actual esta detallada por completo en la documentación del framework, con este recurso podemos elaborar todas las referencias necesarias para el proyecto, sin embargo leerlo por completo puede resultar al principio un poco tedioso.

Para ello siempre es muy útil un cheatsheet o chuleta para poder visualizarlos juntos.

Chuleta - Modelos en Django

Chuleta - Modelos en Django

Ejemplo de modelo en nuestro proyecto

Vamos con el ejemplo del capítulo para poder entender mejor como va esto del modelo.

Nota

Para poder continuar con este ejemplo, tienen que seguir el curso desde el primer capítulo y evitar solamente copiar y pegar, escribanlo que es mejor en todo sentido.

Nuestro archivo: models.py de la semana pasada quedó así:

from django.db import models

class Bebida(models.Model):
	nombre = models.CharField(max_length=50)
	ingredientes = models.TextField()
	preparacion = models.TextField()

	def __unicode__(self):
		return self.nombre

Este modelo solo fue un ejemplo para saber cómo funcionaba, ahora redactaré algunas líneas que nos ayudarán a tener un modelo más completo:

#encoding:utf-8
from django.db import models
from django.contrib.auth.models import User

class Bebida(models.Model):
  nombre = models.CharField(max_length=50)
  ingredientes = models.TextField()
  preparacion = models.TextField()

  def __unicode__(self):
      return self.nombre

class Receta(models.Model):
  titulo = models.CharField(max_length=100, unique=True)
  ingredientes = models.TextField(help_text='Redacta los ingredientes')
  prepacion = models.TextField(verbose_name='Preparación')
  imagen = models.ImageField(upload_to='recetas', verbose_name='Imágen')
  tiempo_registro = models.DateTimeField(auto_now=True)
  usuario = models.ForeignKey(User)
	
  def __unicode__(self):
      return self.titulo

Son clases en Python (respetar la indentación), les explicaré de que trata todo esto:

#encoding:utf-8 <- Esta línea permite usar tíldes y caracteres especiales 
from django.db import models <- Clase con la descripción de modelos
from django.contrib.auth.models import User <- Llama al modelo usuario

La clase Bebida de la semana anterior sólo era un ejemplo, no le daremos importancia de ahora en adelante, pasemos con la clase Receta (y sus respectivos comentarios previos a cada línea).

#Dato cadena, longitud máxima 100 y único
titulo = models.CharField(max_length=100, unique=True)

#Dato texto, con texto de ayuda
ingredientes = models.TextField(help_text='Redacta los ingredientes')

#Dato texto, con nombre: Preparación
prepacion = models.TextField(verbose_name='Preparación')

#Dato imagen, se almacenarán en la carpeta recetas, titulo: Imágen
imagen = models.ImageField(upload_to='recetas', verbose_name='Imágen')

#Dato Fecha y Hora, almacena la fecha actual
tiempo_registro = models.DateTimeField(auto_now=True)

#Enlace al modelo Usuario que Django ya tiene construido
usuario = models.ForeignKey(User)

La clase Receta (modelo) tiene un atributo imagen, el cuál está direccionando las cargas que haga el usuario a la carpeta ‘recetas’ (carpeta que estará dentro de otra llamada: ‘carga’), para que esto funcione debemos modificar nuestro archivo settings.py, exactamente debemos buscar la línea: MEDIA_ROOT (debe ser la número 56 aproximadamente), y dejarla así:

MEDIA_ROOT = os.path.join(RUTA_PROYECTO,'carga')

Luego de haber puesto esta línea, debemos crear una carpeta que se llame ‘carga’ dentro de la carpeta del proyecto. Debemos tener un árbol de ficheros de este tipo:

Mapa de ficheros del proyecto recetario

Mapa de ficheros del proyecto recetario

Dentro de esta carpeta ‘carga’ aparecerá una carpeta ‘recetas’ al momento de guardar un registro. Pero antes de ello debemos buscar el archivo admin.py y dejarlo asi:

from principal.models import Bebida, Receta
from django.contrib import admin

admin.site.register(Bebida)
admin.site.register(Receta)

Esto nos permitirá agregar el modelo Receta dentro de la interfaz administrativa.

Por último debemos habilitar las URL para poder visualizar las imágenes, para ello debemos dejar el archivo urls.py asi:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$','principal.views.lista_bebidas'),
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^media/(?P.*)$','django.views.static.serve',
		{'document_root':settings.MEDIA_ROOT,}
	),
)

Esto nos permitirá acceder a las imágenes que subamos desde http://127.0.0.1:8000/media/recetas/nombre-imagen.jpg (o cualquier otra imagen).

Poniendo a correr todo

Para hacer funcionar todo, debemos sincronizar la base de datos nuevamente (esto se debe hacer cada vez que se modifique el modelo).

Nota

Toda ejecución de comando se debe hacer desde una terminal o ventana de comando y dentro de la carpeta del proyecto (donde se encuentra el archivo manage.py)
python manage.py syncdb

Y esto nos debe mostrar un resultado así (prestar atención a la segunda línea):

python manage.py syncdb

python manage.py syncdb

En caso de que queramos modificar un modelo ya existente podemos también reiniciar todos los modelos de la aplicación principal así:

python manage.py reset principal

Sin embargo si ya se tienen datos almacenados estos se perderán al momento de reiniciarlos, para evitar eso podemos usar aplicaciones como South, que nos permitirán trabajar con los datos de manera más profesional. Aquí un video de ejemplo:

[youtube http://www.youtube.com/watch?v=s41rV2kfRPI&feature=youtu.be]

Probando el ejemplo

Ya tenemos todo listo, el modelo nuevo sincronizado, las configuraciones listas y la interfaz administrativa. Corremos el proyecto:

python manage.py runserver

Entramos a http://127.0.0.1:8000/admin y debemos observar el nuevo modelo: Recetas, listo para ser usado. Para ver las imágenes que se van cargando podemos ir a http://127.0.0.1:8000/media/recetas/nombre-imagen.jpg y si son proactivos, pueden modificar la plantilla de la semana pasada para poder ver el nuevo modelo de Recetas y sus imágenes, o pueden crear nuevos modelos para ver como pueden interactuar entre sí.

No se olviden que pueden revisar el repositorio del proyecto en github si desean comprobar como deben quedar los archivos (en orden y en contenido).

La próxima semana sabremos que hacer con estos modelos y como interactuar con sus datos, lo haremos a través de la Shell de Django.

Que tengan un buen inicio de semana con Django, no se olviden comentar, twittear y hacer todas sus consultas, para poder ayudarlos.