Django se centra en las aplicaciones controladas por datos, por lo que proporciona su propio asignador relacional de objetos (ORM). Exploraremos los conceptos de ORM y cómo funciona el ORM de Django. Crearemos nuestros propios modelos y configuraremos la base de datos.
Aunque es posible crear aplicaciones que interactúen directamente con una base de datos relacional, esta interacción directa puede conducir a código duplicado y poco seguro. Para solventar este problema, se introdujeron los asignadores relacionales de objetos (ORM), que separan las llamadas de base de datos de los objetos.
Como desarrollador, puede usar los ORM para diseñar objetos que representen los datos. Los ORM también pueden administrar las operaciones de la base de datos.
Django tiene un ORM integrado, que es un componente básico del marco.
Trabajaremos en un sitio web de refugios para perros. Este proyecto se centra en recopilar información sobre todos los refugios de perros existentes y los perros que esperan ubicar en Estados Unidos. La esperanza ficticia de esta aplicación es que los perros podrán encontrar hogares adecuados con más rapidez, ya que habrá personas de todo Estados Unidos que quieran adoptarlos, y no solo de su área local.
Django es un buen marco para este proyecto porque proporciona una ruta para desarrollar rápidamente una aplicación orientada al cliente. También proporciona una función de administración y base de datos establecida a la que pueden acceder fácilmente los empleados para obtener una actualización rápida
git clone https://github.com/MicrosoftDocs/mslearn-django-models-data
cd mslearn-django-models-data/starter
py -3 -m venv venv
.\\venv\\Scripts\\activate
pip install -r requirements.txt
python manage.py runserver
Trabajar con una base de datos relacional requiere una mentalidad diferente de la que requiere el trabajo con objetos en una aplicación. Cambiar entre estos dos entornos puede ralentizar el proceso de creación de una aplicación. Además, para convertir los resultados de las consultas de una base de datos en datos que la aplicación pueda utilizar se requiere un código adicional.
Los asignadores relacionales de objetos, u ORM, resuelven este problema actuando como middleware entre una aplicación y la base de datos. Puede crear objetos que modelan los datos, incluida la adición de restricciones y otras formas de metadatos. Así pues, el ORM:
- Administra la creación y actualización de la base de datos según sea necesario.
- Controla las consultas.
- Convierte (o asigna) las solicitudes que se realizan mediante los objetos en las llamadas de base de datos adecuadas.
Django se creó para aplicaciones controladas por datos, por lo que es natural que tenga un ORM integrado. El ORM de Django resultará natural para los desarrolladores de Python, ya que usa la herencia y la sintaxis de clase.
Dado que Django está diseñado para ser un marco web, puede usar la estructura de los modelos que crea para generar automáticamente HTML y formularios. En la mayoría de los casos, Django puede crear dinámicamente el código HTML para permitir al usuario editar los datos sin necesidad de crear el formulario manualmente. Incluso puede administrar las llamadas de base de datos.
Los modelos se encuentran en el corazón de cualquier ORM. Un modelo es una representación de los datos con los que trabajará la aplicación.
En Django, un modelo es cualquier clase que hereda una colección de funcionalidades de django.models.Model
. La colección incluye métodos que permiten consultar la base de datos, crear nuevas entradas y guardar actualizaciones. También puede definir campos, establecer metadatos y establecer relaciones entre los modelos.
from django.db import models
class Product(models.Model):
# details would go here
pass
class Category(models.Model):
# details would go here
pass
es importante resaltar el hecho de que un modelo es una clase de Python. Como resultado, puede agregar métodos e invalidar los que proporciona Django.models
.Model o los que son inherentes a todos los objetos de Python.
Un método concreto que cabe resaltar es __str__
. Este método se usa para mostrar un objeto si no se especifica ningún campo.
class Product(models.Model):
name = models.TextField()
def __str__(self):
return self.name
Los campos definen la estructura de datos de un modelo.
Los diferentes datos tienen diferentes tipos de datos, reglas de validación y otras formas de metadatos. El ORM de Django contiene un amplio conjunto de opciones para configurar los campos de los modelos según sus especificaciones. El ORM es extensible, por lo que puede crear sus propias reglas según sea necesario.
La parte principal de los metadatos de todos los campos es el tipo de datos que almacenará, como una cadena o un número. Los tipos de campo se asignan a un tipo de base de datos y un tipo de control de formularios HTML (como un cuadro de texto o una casilla). Django usa varios tipos de campo, incluidos los siguientes:
CharField
: una línea de texto única.TextField
: varias líneas de texto.BooleanField
: una opción booleana true/false.DateField
: una fecha.TimeField
: una hora.DateTimeField
: fecha y hora.URLField
: una dirección URL.IntegerField
: un número entero.DecimalField
: un número decimal de precisión fija.
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
class Category(models.Model):
name = models.TextField()
Puede usar las opciones de campo para agregar metadatos para permitir valores NULL o en blanco, o para marcar un campo como único. También puede establecer opciones de validación y proporcionar mensajes personalizados para los errores de validación.
Al igual que con los tipos de campo, las opciones de campo se asignan a la configuración adecuada en la base de datos. Las reglas se aplicarán en los formularios que Django genere automáticamente.
Las opciones de campo se pasan a la función del propio campo. Distintos campos pueden admitir distintas opciones. Algunas de las opciones más comunes son las siguientes:
null
- Opción booleana para permitir valores NULL.
- El valor predeterminado es False.
blank
- Opción booleana para permitir valores en blanco.
- El valor predeterminado es False.
default
- Permite la configuración de un valor predeterminado si no se proporciona un valor para el campo.
- Si quiere establecer el valor predeterminado en una base de datos null, establezca default en None.
unique
- Este campo debe contener un valor único.
- El valor predeterminado es False.
min_length
ymax_length
- Se usa con tipos de cadena para identificar la longitud mínima y máxima de la cadena.
- El valor predeterminado es None.
min_value
ymax_value
- Se usa con tipos numéricos para identificar los valores mínimo y máximo.
auto_now
yauto_now_add
- Se usa con tipos de fecha y hora para indicar si se debe usar la hora actual.
auto_now
siempre establecerá el campo en la hora actual al guardar, lo que resulta útil para los campos last_update.auto_now_add
establecerá el campo en la hora actual en el momento de la creación, lo que resulta útil para los campos creation_date.
from django.db import models
class Product(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
price = models.DecimalField(min_value=0.99, max_value=1000)
creation_date = models.DateField(auto_now_add=True)
class Category(models.Model):
name = models.TextField(max_length=50, min_length=3, unique=True)
Una práctica estándar en las bases de datos relacionales es tener una clave principal para cada fila de una tabla, normalmente un entero incrementado automáticamente. El ORM de Django agregará esta clave automáticamente a todos los modelos que cree mediante la adición de un campo denominado id
.
Si quiere invalidar este comportamiento, puede establecer el campo que quiere que sea la clave principal. Sin embargo, debe basarse en el campo id
de Django en la mayoría de las situaciones.
Las bases de datos relacionales también tienen relaciones entre las tablas. El ORM de Django admite todas las relaciones que podría querer crear entre los modelos.
La relación más común es "de uno a varios", técnicamente conocida como relación de clave externa. En una relación de clave externa, varios elementos comparten un solo atributo. Para modelar esta relación, se usa el campo ForeignKey
.
Para crear la relación, agregue el campo ForeignKey
al objeto secundario. Django agrega automáticamente una propiedad al elemento primario para proporcionar acceso a todos los elementos secundarios denominados <child>_set
, donde <child>
es el nombre del objeto secundario.
ForeignKey
tiene un parámetro obligatorio, on_delete. Este parámetro indica a Django qué debe hacer si se elimina el elemento primario. Las dos opciones más comunes son:
- CASCADE
- PROTECT
from django.db import models
class Product(models.Model):
name = models.TextField()
price = models.DecimalField()
creation_date = models.DateField()
category = models.ForeignKey(
'Category', #The name of the model
on_delete=models.PROTECT
)
class Category(models.Model):
name = models.TextField()
# product_set will be automatically created
Al crear un modelo, puede definir los campos esenciales y el comportamiento de los datos. Vamos a agregar los modelos necesarios para la aplicación dog_shelters.
Django proporciona un archivo vacío denominado models.py que puede usar para los modelos.
-
Abra el archivo dog_shelters/models.py
-
Agregue dos clases de Python para contener los modelos escribiendo el código siguiente en el comentario
Create your models here
:# Create your models here class Shelter(models.Model): name = models.CharField(max_length=200) location = models.CharField(max_length=200) def __str__(self): return self.name class Dog(models.Model): shelter = models.ForeignKey(Shelter, on_delete=models.PROTECT) name = models.CharField(max_length=200) description = models.TextField() intake_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name
Todas las aplicaciones deben estar registradas con el proyecto en Django. Puede parecer poco intuitivo, pero el simple hecho de que exista una carpeta de aplicación dentro de un proyecto, no significa que esa carpeta se cargue automáticamente. Necesitamos registrarla agregándola a la lista INSTALLED_APPS
.
- Vaya al archivo dog_shelters/apps.py y compruebe que el nombre de clase es
DogSheltersConfig
en el código siguiente:class DogSheltersConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'dog_shelters'
- Abra settings.py en el proyecto.
- Agregue la ruta de acceso completa al nombre de clase en el comentario
#[TODO] - Add the app to the list of INSTALLED_APPS
:#[TODO] - Add the app to the list of INSTALLED_APPS 'dog_shelters.apps.DogSheltersConfig',
El ORM de Django va más allá de permitirle interactuar con los datos. También puede usarlo para crear y actualizar la base de datos mediante un proceso conocido como migraciones.
Una migración es una colección de actualizaciones que se realiza en el esquema de una base de datos. Un esquema de base de datos es la definición de la propia base de datos, incluidas todas las tablas y columnas y las relaciones entre esas tablas.
Cuando creamos nuestros modelos y definimos los campos, también definimos las tablas, columnas y relaciones entre esas tablas. Al crear los modelos, hemos creado la definición de esquema.
Las migraciones se usan para crear y actualizar la base de datos a medida que cambian los modelos. Como probablemente sabe, el software cambia constantemente. La forma en que se definen los modelos hoy podría ser diferente de cómo se definen mañana. Las migraciones nos ahorran el proceso de actualizar la base de datos nosotros mismos. Así pues, podemos realizar cambios en los modelos y usar Django para realizar los cambios necesarios en la base de datos.
Para crear una migración, use el comando makemigrations
de manage.py. El comando makemigrations
usa la lista actual de migraciones para obtener un punto de partida y, después, usa el estado actual de los modelos para determinar la diferencia. Por último, genera el código necesario para actualizar la base de datos.
python manage.py makemigrations
Todas las operaciones que se producen dentro de una base de datos relacional requieren SQL. Las migraciones de Django generan el SQL adecuado cuando se ejecutan. Aunque puede usar las herramientas de migración para actualizar la base de datos directamente, algunos entornos pueden tener administradores de bases de datos que administren el proceso automáticamente.
Para compilar las instrucciones SQL adecuadas, puede usar sqlmigrate
.
python manage.py sqlmigrate <app_label> <migration_name>
Si quiere ver todas las migraciones, puede usar showmigrations
.
python manage.py showmigrations
El comando migrate
ejecuta una migración específica o todas las migraciones en la base de datos configurada en settings.py en la raíz de la carpeta del proyecto.
Si abre settings.py, verá una sección DATABASES
en la parte inferior. En esta sección se incluye una opción default, que en un nuevo proyecto está configurada para usar SQLite. Puede configurar diferentes cadenas de conexión de base de datos en esta sección según sea necesario.
python manage.py migrate <app_label> <migration_name>
Una vez que hemos creado los modelos, podemos crear la base de datos. Usaremos el SQLite predeterminado y las herramientas disponibles en Django.
python manage.py showmigrations
python manage.py makemigrations dog_shelters
python manage.py migrate
Al crear los modelos, creamos una API que se puede usar para acceder a los datos de la base de datos. Esta API nos permite crear, recuperar, actualizar y eliminar objetos de la base de datos.
Django incluye un shell interactivo en el que puede ejecutar código de Python en el entorno de Django.
- Ejecute el comando siguiente para iniciar el shell:
python manage.py shell
- Importe los modelos desde models dentro de dog_shelters:
from dog_shelters.models import Shelter, Dog
Dado que los modelos son clases de Python, las nuevas instancias se crean con la misma sintaxis que usaríamos para crear un objeto. Dado que heredan de Django.models.Model
, heredan la funcionalidad del ORM de Django. Esa funcionalidad incluye save
, que se usa para guardar el objeto en la base de datos.
- Cree un nuevo refugio ejecutando el comando de Python siguiente en el shell:
shelter = Shelter(name="Demo shelter", location="Seattle, WA") shelter.save()
- Actualice la ubicación del refugio a Redmond, WA; para ello, establezca el campo location llamando a save:
shelter.location = "Redmond, WA" shelter.save()
- Cree dos nuevos perros para el refugio ejecutando los comandos de Python siguientes en el Shell:
Dog(name="Sammy", description="Cute black and white dog", shelter=shelter).save() Dog(name="Roscoe", description="Lab mix", shelter=shelter).save()
Para recuperar objetos de una base de datos, Django proporciona una propiedad objects
en todas las clases Model
. La propiedad objects
proporciona varias funciones, como all
, filter
y get
.
- Recupere todos los perros del Refugio de demostración ejecutando el comando siguiente:
shelter.dog_set.all()
- Recupere el segundo perro usando
get
tal como se muestra en el comando siguiente:Dog.objects.get(pk=1)
- Recupere todos los perros del refugio de demostración mediante
filter
tal como se muestra en el comando siguiente:Dog.objects.filter(shelter__name='Demo shelter')
Cuando haya terminado de experimentar con los objetos, puede cerrar el shell mediante el comando exit()
.