SecNot

jun 22, 2015

Inicializar la base de datos en Django

Algunas veces es necesario inicializar la base de datos antes de poder usar una aplicación, si esta aplicación no va a reutilizarse no es ningún problema, en cambio si es algo que planeas usar en varios proyectos, es mucho mas práctico añadir los datos de inicialización en la misma aplicación y cargarlos usando loaddata. Imaginemos una aplicación para la gestión de los productos de una tienda, en la que tenemos los siguientes modelos:

#tienda/models.py
from django.db import models

class Categoria(models.Model):

    nombre = models.CharField(max_length=80)
    slug = models.SlugField(unique=True, db_index=True)
    descripcion = models.TextField(max_length=2000)


class Producto(models.Model):

    nombre = models.Charfield(max_length=200)
    descripcion models.TextField(max_length=2000)
    precio = models.DecimalField()
    categoria = models.ForeignKey(Categoria)

Django permite crear un directorio llamado fixtures dentro de la aplicación donde almacenar archivos de datos que luego pueden ser volcados a la base de datos para inicializarla.

Estos archivos pueden crearse usado tres formatos JSON, YAML, XML, yo creo que los dos primeros son la mejor opción, más fáciles de leer y modificar manualmente. Veamos un ejemplo para JSON:

[
{
    "model": "tienda.categoria",
    "fields": {
        "nombre": "Ordenadores portatiles",
        "slug": "portatiles",
        "descripcion": "Ordenadores portatiles de 13 a 17 pulgadas",
    },
    "pk": 100000
},
{
    "model": "tienda.categoria",
    "fields": {
        "nombre": "Tablets",
        "slug": "tablets",
        "descripcion": "Tablets android",
    },
    "pk": 100001
},
{
    "model": "tienda.producto",
    "fields": {
        "nombre": "ASUS MeMO Pad 10 ME103K 16GB",
        "precio": "120.50",
        "descripcion": "La ASUS MeMO Pad 10 se creó pensando en...",
        "categoria": 100001,
    }
}
]

y los mismos datos en YAML:

- model: tienda.categoria
pk: 100000
fields:
    nombre: "Ordenadores portatiles"
    slug: "portatiles"
    descripcion: "Ordenadores portatiles de 13 a 17 pulgadas"

-model: tienda.categoria
pk: 100001
fields:
    nombre: "Tablets"
    slug: "tablets"
    descripcion: "Tablets Android"

- model: tienda.producto
pk: 100000
fields:
    nombre: "ASUS MeMO Pad 10 ME103K 16GB"
    precio: "120.50"
    descripcion: "La ASUS MeMO Pad 10 se creó pensando en..."
    categoria: 100001

Si tienes el archivo de inicialización en la ruta tienda/fixtures/categorias.json, se puede cargar los datos con:

$ python manage.py loaddata categorias

Por último aunque es posible crear y editar manualmente los archivos, Django proporciona una herramienta para volcar la base de datos a un archivo usando cualquiera de los formatos soportado, con lo que se puede usar el interfaz Admin para crear los datos y luego volcarlos con:

$ python manage.py dumpdata tienda --indent 4 --format json --output tienda/fixtures/categorias.json

Y eso es todo por hoy.