Esta es la continuación de un post anterior sobre la creación de una app con Django, el framework de Python.
En la entrada anterior vimos una pequeña introducción a Django, las vistas, las URLs y todo lo necesario para comenzar.
Ahora veremos cómo:
- Trabajar con bases de datos y migraciones en Django
- Crear modelos que van a representar entidades dentro de las bases de datos
- Generar migraciones y tablas de la base de datos usando Django
Recuerda que puedes ver la parte anterior aquí, y el código en GitHub aquí.
Bases de datos en Django
Por defecto, Django utiliza SQLite 3 para el almacenamiento de datos; pero permite cambiar a otros motores fácilmente.
Cada aplicación incluida en el núcleo de Django (sesiones, permisos, autenticación y otras cosas propias del framework) necesita una base de datos de igual manera, y la generación de las mismas se hace a través de migraciones.
Comencemos viendo el archivo settings.py que muestra las apps instaladas y las configuraciones de las bases de datos:
#------
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#------
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Por defecto se usa sqlite3 y el nombre es db.sqlite3
También fíjate en el apartado INSTALLED_APPS
, las mismas vienen incluidas en el núcleo de Django para facilitarnos algunas cosas.
Si se quisiera modificar el motor, simplemente hay que modificar el apartado de DATABASES
y agregar un usuario y contraseña en caso de ser necesario, pero eso lo veremos en otro post.
Más adelante vamos a modificar INSTALLED_APPS
para agregar nuestra app de gastos y de esta manera hacer que se generen las migraciones automáticas.
Migraciones en Django
Las migraciones en Django son una manera de modificar la estructura de las bases de datos. En ocasiones se crean tablas, en otras se remueven, pero siempre se hacen en una sola migración.
Por ejemplo, se podría tener una migración para crear la tabla de ingresos monetarios, y si después se agrega una tabla con una relación, se podría crear otra migración.
Vamos a comenzar haciendo la primer migración, que va a crear tablas que el framework utiliza.
Para ello, ejecuta:
python manage.py migrate
Si analizamos la base de datos, veremos que se han creado tablas que no nos pertenecen pero son necesarias para Django:
Todavía no hemos creado tablas para nuestros modelos, eso lo haremos en un momento.
Modelos
Los modelos en Django son (sin definición formal) clases que pertenecen a una tabla de la base de datos. Un modelo puede ser:
- Gasto
- Usuario
- Persona
- Pago
- Factura
- Cualquier objeto de la vida real (una clase de POO)
Y tiene propiedades (id, nombre, costo, precio, fecha, etcétera). También puede tener relaciones con otro modelo.
Creando nuestro modelo de gastos
Vamos a crear el modelo que representa al Gasto, agregando la clase en el archivo gastos/models.py de manera que quede así:
from django.db import models
# Create your models here.
class Gasto(models.Model): # Extiende de models.Model
fecha = models.DateField(auto_now_add=True)
descripcion = models.CharField(max_length=100)
monto = models.DecimalField(max_digits=12, decimal_places=2)
Tenemos la fecha, de tipo DateField
, estamos especificando que su valor será la fecha y hora en la que se guarde (con auto_now_add
)
La descripción es un texto cuya longitud máxima (max_length
) es de 100
El monto es un valor decimal que tiene 12 dígitos, 2 de los cuales van a la derecha del punto.
No estoy especificando el Id, pues un entero autoincrementable es creado de manera automática.
Nota: la documentación oficial de las propiedades o campos de un modelo puede verse aquí.
Registrar app
Todavía no hemos registrado nuestra app dentro de INSTALLED_APPS
para que se ejecuten las migraciones; es hora de registrarla.
En el archivo proyecto_gastos/settings.py vamos a agregar gastos.apps.GastosConfig
al arreglo, de forma que quede así:
# Application definition
INSTALLED_APPS = [
'gastos.apps.GastosConfig', # Incluimos nuestra app, ubicada en gastos/apps.py
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Recuerda que GastosConfig es la clase que vive dentro de gastos/apps.py
Generando migración a partir de modelo
Ahora que hemos registrado nuestra app, podemos hacer que se generen tablas de la base de datos para el mismo.
Vamos a crear las migraciones con:
python manage.py makemigrations gastos
Eso va a crear una migración ubicada en gastos/migrations/0001_initial.py que puede verse así (no la modifiques, fue generada por Django):
# Generated by Django 2.2 on 2019-07-30 22:57
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Gasto',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fecha', models.DateField(auto_now_add=True)),
('descripcion', models.CharField(max_length=100)),
('monto', models.DecimalField(decimal_places=2, max_digits=12)),
],
),
]
Fíjate en que esto solo crea la migración, pero no la aplica. Para aplicarla debemos ejecutar:
python manage.py migrate
Hasta ahora nuestra terminal debe verse así:
Si vemos nuestra base de datos vamos a ver que la tabla se ha creado correctamente:
Con todo esto hemos creado la estructura de base de datos que necesita nuestra app, sin escribir ni un poco de código SQL.
Si en el futuro agregamos más modelos, simplemente tendríamos que generar y hacer las migraciones.
En el próximo tutorial vamos a ver cómo administrar la información desde el panel de control de administración que Django ofrece.
Hola, al crear modelo en Django no se ordena en PostgreSQL.
id_banco = models.ForeignKey(Banco)
descripcion = model..; estado = model..
PostgreSQL.- id_banco; estado; descripcion
su ayuda por favor para que salgan ordenados como esta en Django