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.