Creando nuestra aplicación y modelos en django
curso-django 2020-09-02 10:18:43
Una de las aspectos más importantes que debemos de tomar en cuenta a la hora de iniciarnos profesionalmente como desarrolladores de software es el ahorro de tiempo y la reutilización de código.
El segundo esta intrínsecamente relacionado con el primero, ya que reutilizar partes de una solución en otra nos permitirá ahorrarnos un valioso tiempo que puede ser dedicado a tareas más específicas de cada proyecto.
Django nos permite esta reutilización de código mediante las aplicaciones.
No hay reglas rígidas establecidas para decidir cuantas aplicaciones debe tener tu proyecto, será tu sentido común y tu experiencia las que te digan si tu proyecto tendrá una o más aplicaciones.
Veamos el ejemplo que vamos utilizar en nuestro curso, como mencionamos en capítulo anterior vamos a crear nuestro proyecto de comprar gestionando tres entidades perfectamente identificables, clientes, artículos y compras.
Podríamos perfectamente gestionar todo desde una misma aplicación, sin embargo quizás sería recomendable imaginar qué partes de nuestro sistemas podrían utilizarse en posteriores proyectos.
Que tal en un futuro necesitamos incorporar nuestros clientes en otro proyecto, o que tal si necesitamos nuestro modelo de artículos para un futuro proyecto de gestión de inventario? Con la utilización de las aplicaciones podremos mantener de una forma organizada esa funcionalidad que quizás mañana podemos llegar a reutilizar.
En nuestro caso gestionaremos dos aplicaciones, una llamada CustomersApp que contendrá los clientes y las compras realizadas por éstos, y otra llamada ProductsApp, encargada de la gestión de los artículos.
Nuevamente, esto es opcional y podríamos solo usar una aplicación para todos nuestro proyecto, pero en nuestro caso serán las dos aplicaciones nombradas anteriormente las que utilizaremos.
Pasemos a crear éstas con los siguientes comandos
python manage.py startapp CustomersApp
python manage.py startapp ProductsApp
Una vez ejecutado estos comandos podremos observar dentro de nuestro proyecto las carpetas correspondiente a estas aplicaciones las cuales llevan el mismo nombre.
Nos resta aún registrar nuestras aplicaciones en el archivo settings.py de nuestro proyecto, para eso vamos a la sección de aplicaciones instaladas (INSTALED_APPS), y agregamos nuestras aplicaciones como puede verse debajo:
INSTALLED_APPS = [
'django.contrib.admin',
... ... ...
'CustomersApp',
'ProductsApp',
]
No olvides guardar el archivo una vez que hayas realizado los cambios.
Creando nuestros modelos
Ahora que hemos creado nuestras aplicaciones pasemos a nuestros modelos de datos necesarios, para los clientes aprovecharemos el modelo user que django nos crea de forma predeterminada (éste modelo será usado además para autenticarse en las credenciales apropiadas y generar los órdenes de compras deseadas)
Users
Campo |
Tipo |
id |
entero autonumérico |
password |
texto |
username |
texto |
first_name |
texto |
last_name |
texto |
email |
texto |
Product
Campo |
Tipo |
id |
entero autonumérico |
product_name |
texto |
price |
entero con decimales |
Purchase
Campo |
Tipo |
id |
entero autonumérico |
user |
relación a id de usuario |
products |
relación a id de usuario |
unit_price |
entero con decimales |
quantity |
entero |
total_price |
entero con decimales |
Esto no es otra cosa que la base de datos de nuestro sistema, la cual gestionaremos con sus respectivos modelos en Django (luego ya veremos cómo migrarlas a nuestra base de datos).
Para crear los modelos debemos escribir sus estructuras en las páginas models.py, las cuales se encuentran dentro de las carpetas de nuestras aplicaciones, por lo que debemos respetar donde crearemos cada modelo según nuestro proyecto, es decir, crearemos el modelo Purchase para las compras dentro de CustomersApp/modelos.py, y el modelo Product los crearemos en ProductsApp/models.py.
Comencemos definiendo este último, nuestro modelo Product, creándolo en el archivo models.py dentro de la carpeta ProductsApp).
La primera línea de este archivo Django ya la trae de forma predeterminada para importar la clase models (necesario para trabajar con los modelos).
Luego Django nos dice de ingresar allí los modelos debajo del mismo comentario, en entonces donde definimos nuestra clase Product.
from django.db import models
# Create your models here.
class Product(models.Model):
product_name = models.CharField(max_length=100, blank=False, null=False)
price = models.FloatField(blank=False, null=False)
Nota que en nuestra clase Product no hemos agregado el campo id (el cual es destinado para la clave primaria), ya que django lo creará automáticamente por nosotros.
También puedes apreciar que tampoco permitiremos valores en blanco o nulos en los campos product_name y price mediante las instrucciones blank=False y null=False, mientras que con max_length especificamos el tamaño máximo admitido para el campo product_name
Pasemos ahora a hacer lo propio para la aplicación CustomersApp, para lo cual debemos definir nuestra clase Purchase (en el archivo models.py dentro de la carpeta CustomersApp).
Verás que no definimos el modelo para user porque, como lo mencionamos anteriormente, utilizaremos el modelo user que ya nos proporciona Django.
from django.db import models
from django.contrib.auth.models import User
from ProductsApp.models import Product
# Create your models here.
class Purchase(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
unit_price = models.FloatField(blank=False, null=False)
quantity = models.IntegerField(blank=False, null=False)
total_price = models.FloatField(blank=False, null=False)
En este modelo notarás algunas particularidades, dado que éste estará relacionado mediante dos claves foráneas a los modelos user y product, será necesario importar éstos para poder utilizarlos.
El primero lo importamos desde django.contrib.auth.models, mientras que el segundo lo importamos desde nuestra aplicación ProductsApp.models.
Nota que esta relación esta creada en los campos user y product, en el primero definimos on_delete=models.CASCADE para que al eliminar un usuario se eliminen todas las compras relacionadas, mientras que para product con on_delete=models.PROTECT establecemos que no se puedan eliminar articulos que figuren en alguna compra
Migraciones (migrations)
Ahora que tenemos definido nuestros modelos debemos migrar éstos a una base de datos.
A la hora de trabajar con base de datos Django nos ofrece una herramienta invaluable, las migraciones. Mediante éstas podrás propagar los cambios que hagas en tus modelos de Django hacia las bases de datos, lo que permitirá replicar en ellas lo que creaste en tu modelo sin siquiera usar sql.
Si estas iniciándote en este mundo del desarrollo ten en cuenta que esto no significa que como programador no debas saber utilizar el lenguaje sql, por el contrario, sql forma parte de los lenguajes básicos que tú debes conocer, no obstante mediante las migraciones o, dicho de una forma general, mediante los ORM (Object-Relational Mapping o Mapeo Objeto Relacional) podrás ahorrarte tiempo en estas tareas de creación de esquemas en las bases de datos y/o en la creación de inserción, consulta, modificación y eliminación de datos en éstas (lo que comúnmente conocemos como CRUD por sus siglas en ingles de Create, Read, Update y Delete).
Los comandos que podrás utilizar relacionados con la migración de esquemas son migrate, makemigrations, sqlmigrate y showmigrations, veamos para que sirve cada uno de ellos.
makemigrations
Lo utilizarás para empaquetar nuevas migraciones basadas en los cambios que hayas realizados en tus modelos.
migrate
Con él podrás aplicar las migraciones que hayan sido empaquetadas con makemigrations, como también volver atrás migraciones ya realizadas.
sqlmigrate
Muestra las instrucciones sql de una migración.
showmigrations
Muestra una lista con las migraciones de un proyecto como también su estado.
Explicado esto pasemos a generar nuestra base de datos, en nuestro caso utilizaremos como base de datos a SQLite ya que ésta viene ya integrada con nuestra instalación de django.
Ten en cuenta que SQLite está destinado para facilitar nuestros desarrollos, sin embargo en un entorno de producción debes usar otras bases de datos, como PostgreSQL o MySQL
Lo primero será en una consola del sistema situarnos en la carpeta de nuestro proyecto.
Si estás trabajando con Visual Studio Code puedes ir al menú Terminal y seleccionar la opción New Terminal, con lo que se abrirá en tu IDE una ventana inferior donde podrás escribir tus comandos (otros IDEs trabajan de forma similar posibilitando escribir tus comandos sin salir del entorno.)
Una vez allí para poder migrar nuestros modelos ejecutamos los siguientes comandos
python manage.py makemigrations
python manage.py migrate
Verás entonces que django nos irá mostrando el resumen de las operaciones realizadas. Podrás ver que, además de nuestros modelos purchase y product, también será creado el modelo user, como así también otras tablas que django crea de forma automática.
Por ahora no nos vamos a detener en la explicación de esas otras tablas, pero si podemos corroborar los cambios en la misma base de datos.
La nueva base de datos la encontrarás en tu proyecto con el nombre db.sqlite3. Para abrirla puedes instalarte algún gestor como DB Browser for SQLite (éste es el que usaré a lo largo de este curso, el cual me he descargado desde sqlitebrowser.org), al abrir tu base de datos con éste ya podrás ver tus tablas como se muestra en la figura inferior
Nota que encontraras las tablas CustomersApp_purchase, ProductsApp_product y auth_user necesarias para tu proyecto
En el próximo capítulo de este curso veremos como gestionar nuestra base de datos desde las interfaces de administración que nos proporciona django.