Django (framework de Python)

Tutorial de Django: bases de datos, migraciones y modelos

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:

Tablas creadas por migración de 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í:

Migración de modelo en Django (framework de Python)

Si vemos nuestra base de datos vamos a ver que la tabla se ha creado correctamente:

Tablas de base de datos generadas por migración de framework usando Django (framework de Python)

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • 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

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.