domingo, 7 de abril de 2024

Django database models

La base de datos incluida por defecto en django es db.sqlite3.

Al lanzar el servidor es habitual ver un mensaje similar a este "You have 18 unapplied migration(s)".


Las migraciones son una forma de actualizar nuestra base de datos desde código Python.
Desde código Python interaccionaremos con la base de datos creando las tablas, las relaciones, los usuarios, ...

Las migraciones nos permiten ahorrar trabajo ya que nos ayudan a crear las tablas y relaciones de la base de datos.

DB Browser for SWLite

Descargar este programa.


Está disponible para varios sistemas operativos, incluso para macOS (Apple Silicon).

Para actualizar la base de datos, detenemos el servidor y ejecutamos el comando:

python manage.py makemigrations
python manage.py migrate

Observamos la estructura que aparece con una serie de tablas e índices. Si aparecen cero tablas y cero índices lo que tenemos que hacer es abrir la base de datos con Archivo/Abrir base de datos. Navegamos hasta nuestro archivo que en mi caso está en:

/Users/apa/Documents/github/djangoproject/db.sqlite3 

Estando dentro de la aplicación BD Browser for SQLite, pulsamos F5 para actualizar y ahora deberíamos observamos la estructura que aparece con una serie de tablas e índices ya creados por defecto. 


Sobre la tabla de usuarios pedimos con el botón derecho del ratón Mostrar datos, en inglés aparece como Browse Table.


Esto nos permitirá ver los campos de la tabla de usuarios.


Unamos la aplicación myapp con la configuración del proyecto en mysite.

Django nos da unas tablas por defecto pero posteriormente nosotros desearemos hacer nuestras propias tablas para nuestro proyecto. Para hacer esto nosotros tenemos que poder crear lo que se llama un MODELO. Este modelo es código de Python que se va a transformar en una tabla de SQL. Ahora estamos trabajando en SQLite pero este script de Python se podrá ejecutar en otras base de datos, por ejemplo en postgreSQL, siempre y cuando le hayamos dado la conexión correcta.

Mi aplicación myapp va a tener una serie de modelos específicos para esta aplicación. Para ello nos vamos al archivo models.py que está dentro de la carpeta myapp.

Estando en myapp/models.py voy a crear un modelo específico.

from django.db import models

# Create your models here.
class Project(models.Model):
    # los atributos de la clase serán los campos de la tabla
    name = models.CharField(max_length=200)

Conectar la APP con el proyecto

Para que nuestra aplicación de django conozca nuestros modelos tenemos que conectar el modelo creado, para lo cual vamos a la carpeta principal del proyecto (mysite) y vamos al archivo settings.py y buscamos la sección que contiene la variable INSTALLED_APPS que ya trae, por defecto una serie de conexiones.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]

Hemos añadido al final de la lista 'myapp' y esto ya permite conectar el modelo creado en mi aplicación myapp con el proyecto django.

Ejecutamos las migraciones:

Ahora lanzamos nuevamente el servidor y en otra terminal ejecutamos:

python manage.py makemigrations
python manage.py migrate myapp
Añadir myapp después de migrate es optativo y se hace en caso de querer ejecutar únicamente las migraciones de esa APP.
Se ha generado un archivo myapp/migrations/0001_initial.py. Este archivo no debemos tocarle y contiene el código necesario para que django consiga hacer los cambios necesarios en la base de datos sin nuestra intervención. Este archivo crea por nosotros la tabla con sus campos. Pero no debemos tocarlo.

Si volvemos a consultar ahora la aplicación "DB Browser for SQlite" veremos que se ha agregado una nueva tabla.


Si ya tenías abierta esta aplicación puedes refrescar la tablas pulsando F5.

La nueva tabla que se ha creado se llama myapp_project que tiene el nombre de la aplicación (myapp) y el nombre del modelo, ya que nosotros le habíamos llamado Project, recordemos que habíamos llamado así a la clase (Class Project). 


Con botón derecho del ratón y Browse Table o Mostrar Datos veremos los campos creados Id y name. El Id se crea automáticamente de forma auto-incremental si no se pone otra cosa. El name se crea debido a que nosotros habíamos creado ese atributo en la clase Project.



Creamos otra clase

Vamos a crear otra clase en myapp/models.py:

from django.db import models

# Create your models here.
class Project(models.Model):
    name = models.CharField(max_length=200)

class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    project =  models.ForeignKey(Project, on_delete=models.CASCADE)
El atributo project indicamos que está relacionado con otro proyecto denominado Project, por eso ponemos que se necesita una clave foránea: models.ForeignKey(Project)

Se añade on_delete=models.CASCADE para que cuando se elimine el objeto al que se hace referencia, elimine también los objetos que tengan referencias con él.

En Django, una foreign key (clave foránea) es un campo utilizado para establecer una relación entre dos modelos en una base de datos relacional. Este campo sirve para crear una relación uno a muchos entre dos modelos, donde un modelo tiene una clave que apunta a otro modelo.

Ahora volvemos a ejecutar los comandos para hacer las migraciones.

python manage.py makemigrations
python manage.py migrate

Veremos que se ha creado un nuevo archivo denominado myapp/migrations/0002_initial.py que contiene las nuevas migraciones y que tampoco debemos tocar.

Al refrescar la estructura de la base de datos con F5 en el programa DB Browser for SQLite podemos ver que se ha creado una nueva tabla para las tareas Task.


La nueva tabla se llama myapp_task y si punsamos con el botón derecho del ratón y elegimos Browse Table o Mostrar datos veremos los campos que se corresponden con los atributos creados en la clase Task que hemos creado previamente.


Vemos que aparece project_id ya que cuando se creó el atributo project lo hicimos relacionándolo con otro proyecto (con el que denominamos Project).

Sección DATABASES en settings.py

Ya tenemos, por defecto esta sección en el archivo settings.py que está en mysite.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
Ahora no lo voy a hacer, pero en el futuro podré modificar esta configuración con otra que me permita utilizar otra base de datos, por ejemplo postgreSQL.

No hay comentarios:

Publicar un comentario