models.py
¡Llegó la hora de la verdad! Vamos a definir la estructura de nuestra primera tabla en la base de datos: la tabla de Proveedores. En Django, estas "tablas" se definen como "modelos" (models
), y viven en un archivo específico dentro de cada aplicación que creamos.
Recuerda que en el capítulo anterior creamos nuestra app llamada libreta
. Si abres esa carpeta en VS Code, encontrarás un archivo llamado models.py
. ¡Este es el lugar mágico donde definiremos cómo serán nuestros proveedores!
El archivo models.py
dentro de nuestra app libreta
es donde definiremos nuestras tablas.
Para crear nuestra tabla de proveedores, vamos a definir una clase en Python. Si no estás muy familiarizado con las clases, no te preocupes demasiado por ahora. Piensa en una clase como una "plantilla" o un "molde" que describe cómo es algo. En este caso, describirá cómo es un "Proveedor".
Así es como se empieza a definir nuestro modelo Proveedor
en el archivo libreta/models.py
:
from django.db import models
# Create your models here.
class Proveedor(models.Model):
# Aquí dentro definiremos los campos (columnas) de nuestra tabla
pass # Esta palabra 'pass' es para que Python no dé error por ahora
Desglosemos esto un poquito:
from django.db import models
: Esta línea es importante. Le dice a Python que queremos usar algunas herramientas que Django nos da para trabajar con bases de datos (db
) y definir modelos (models
).class Proveedor(models.Model):
:
class
: Es la palabra clave en Python para empezar a definir una clase (nuestra plantilla).Proveedor
: ¡Este es el nombre que le damos a nuestro modelo! Django, por convención, lo usará para nombrar la tabla en la base de datos (generalmente algo como libreta_proveedor
). Es una buena práctica que los nombres de los modelos empiecen con mayúscula y sean en singular.(models.Model)
: Esto es muy importante. Le dice a nuestra clase Proveedor
que "herede" un montón de funcionalidades súper útiles de una clase base que Django ya tiene preparada, llamada models.Model
. Gracias a esto, nuestro modelo sabrá cómo hablar con la base de datos, cómo guardarse, cómo buscarse, etc., ¡sin que tengamos que programar todo eso nosotros! Es parte de la magia del ORM de Django.# Aquí dentro definiremos los campos...
es un comentario. Python lo ignora, pero nos sirve a nosotros para dejar notas.pass
: Es una palabra clave de Python que simplemente significa "no hacer nada aquí por ahora". La ponemos para que la definición de la clase esté completa sintácticamente mientras aún no hemos añadido los campos. La borraremos enseguida.Ahora vamos a decirle a nuestro modelo Proveedor
qué información queremos guardar para cada proveedor. Cada pieza de información será un "campo" (o columna en la tabla de la base de datos). Recuerda que en el capítulo anterior hablamos de los tipos de datos en Django models.
Vamos a definir los siguientes campos para nuestro proveedor:
Así se traduce esto a código dentro de nuestra clase Proveedor
en models.py
. Reemplaza el pass
con lo siguiente (¡la indentación es muy importante en Python! Asegúrate de que estas líneas estén "dentro" de la clase):
from django.db import models
class Proveedor(models.Model):
nombre = models.CharField(max_length=255, blank=False, null=False)
direccion = models.CharField(max_length=255, blank=True, null=True)
email = models.EmailField(blank=True, null=True)
telefono = models.IntegerField(blank=True, null=True)
def __str__(self):
return self.nombre
Analicemos cada campo:
nombre = models.CharField(max_length=255, blank=False, null=False)
nombre
: Es el nombre que le damos a este campo en nuestro código Python.models.CharField
: Le decimos a Django que este campo guardará texto (caracteres).max_length=255
: Argumento obligatorio para CharField
. Indica que el nombre puede tener como máximo 255 caracteres.blank=False, null=False
: Estos son los valores por defecto, pero los ponemos para ser explícitos. Significan que este campo es requerido tanto en los formularios como en la base de datos. ¡Un proveedor tiene que tener un nombre!direccion = models.CharField(max_length=255, blank=True, null=True)
models.CharField
: También texto.max_length=255
: Límite de caracteres.blank=True, null=True
: Hacemos que la dirección sea opcional. El usuario puede dejarla en blanco en un formulario, y la base de datos puede guardar un valor "nulo" si no se provee.email = models.EmailField(blank=True, null=True)
models.EmailField
: Un tipo especial de campo de texto que, además, valida que lo ingresado tenga un formato de email (con "@" y ".").blank=True, null=True
: También opcional.telefono = models.IntegerField(blank=True, null=True)
models.IntegerField
: Para guardar números enteros.blank=True, null=True
: Opcional. Si el teléfono siempre fuera un número y nunca tuviera guiones o espacios, podríamos usar este. Si pudiera tener caracteres no numéricos, sería mejor un CharField
.def __str__(self): return self.nombre
: Esta es una función especial en Python. No te preocupes demasiado por entenderla a fondo ahora. Lo que hace es decirle a Django cómo "mostrar" un objeto Proveedor si alguna vez necesita convertirlo a texto. En este caso, le decimos que cuando muestre un proveedor, muestre su nombre
. Esto será útil en el panel de administración.
Te estarás preguntando, ¿no necesitamos un número único para identificar a cada proveedor, como un DNI o un código? ¡Sí! Pero la buena noticia es que Django es tan servicial que, por defecto, automáticamente agrega un campo llamado id
a cada modelo. Este campo es un número entero que se incrementa solo y es único para cada proveedor que guardemos. ¡Una cosa menos de la que preocuparnos!
¡Y eso es todo para definir nuestro primer modelo! Hemos descrito la estructura de nuestra tabla de proveedores. Aún no existe en la base de datos, pero ya le dimos a Django el "plano" de cómo debe ser.
El video de este capítulo te guiará paso a paso en la creación de este modelo Proveedor
.
Para definir una tabla en Django, creamos una clase dentro del archivo models.py
de nuestra aplicación (ej: libreta/models.py
). Esta clase debe heredar de models.Model
. Dentro de la clase, definimos cada campo (columna) de la tabla, especificando su nombre, el tipo de dato de Django (como models.CharField
, models.IntegerField
, models.EmailField
) y los argumentos necesarios (como max_length
) u opcionales (como blank=True
, null=True
) para controlar su comportamiento. También es útil definir el método __str__(self)
para una mejor representación textual de los objetos.
Con nuestro modelo Proveedor
definido, el siguiente paso es decirle a Django que queremos usar esta nueva app libreta
en nuestro proyecto general. ¡Vamos a ello!