Fundamentos de Django

1

¿Qué es Django?

2

¿Cómo instalar Django?

3

Entendiendo la arquitectura de Django

4

Qué es el patrón MVT (Model, View y Template)

La M en el Patrón: Modelo

5

Introducción a Modelos y Bases de Datos

Manejo Avanzado de Modelos y Bases de Datos

6

Gestión de Modelos y Bases de Datos en Django con SQLite

7

Inserción de Datos con Django

8

Actualización y Eliminación de Datos en Django

Relaciones y Asociaciones entre Modelos

9

Creación y Gestión de Relaciones entre Modelos en Django

10

Relaciones Muchos a Muchos (N:N) en Django

11

Relaciones Uno a Uno (1:1) en Django

12

Queries y Filtros en Django: Optimización y Estrategias Avanzadas

Configuración de URLs y Vistas Avanzadas

13

Gestión de URLs en Django: Configuración, Rutas y Mejores Prácticas

14

Vistas Basadas en Clases en Django

La T en el Patrón: Plantillas o Templates

15

Personalización de Interfaz con Plantillas en Django

Desarrollo de Aplicaciones en Django

16

Configuración del Proyectos en Django

17

Creación del Modelo para la Aplicación 'Products' en Django

18

Cómo Crear Migraciones de Datos en Django

19

Creación de la Aplicación 'Products' con Formularios en Django

20

Integracion de TailwindCSS en Django

21

Django Admin

22

Manejo de Sesiones en Django

23

Manejo de Órdenes en CoffeShop

24

Manejo de Pedidos en CoffeShop

25

Mixings en vistas basadas en clases

26

Agregar productos a la orden

Django Rest Framework

27

Django REST Framework

Despliegue de aplicaciones Django

28

Configurar PostgreSQL en AWS con Django

29

Variables de entorno en Django

30

¿Cómo usar Unit Testing en Django?

31

Debugging en Django

32

Desplegar aplicaciones de Django en AWS

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Django

Curso de Django

Luis Martínez

Luis Martínez

Relaciones Muchos a Muchos (N:N) en Django

10/32
Recursos

¿Cómo se gestiona una relación de muchos a muchos entre libros y autores?

En el desarrollo de bases de datos relacionales, es común encontrarnos con escenarios donde un registro en una tabla puede relacionarse con múltiples registros en otra tabla, y viceversa. Un ejemplo clásico es el de los libros y sus autores, donde un libro puede tener varios autores y un autor puede haber escrito varios libros. Este modelo de relación se conoce como una relación de muchos a muchos.

Aquí te mostramos cómo implementar esta lógica en tu proyecto:

¿Cómo crear la clase para los autores?

Primero, debemos definir la clase Autor en nuestro modelo de datos. Esta clase representa a los autores de los libros con atributos relevantes como nombre y fecha de nacimiento:

from django.db import models

class Autor(models.Model):
    nombre = models.TextField(max_length=200)
    birth_date = models.DateField()

    def __str__(self):
        return self.nombre

Al definir la clase Autor, heredamos de models.Model y especificamos los atributos fundamentales: nombre y birth_date. Además, definimos el método __str__ para facilitar la representación en la consola.

¿Cómo se conectan los libros y autores?

Para establecer una relación de muchos a muchos entre las clases Book (Libro) y Autor, es necesario ajustar la estructura de la clase Book para incluir un campo authors. Este campo es crucial porque permite vincular múltiples autores a un libro:

class Book(models.Model):
    # Otros campos del libro aquí...
    authors = models.ManyToManyField(Autor, related_name='books')

El uso de models.ManyToManyField define el tipo de relación y el parámetro related_name permite que, desde un autor, se pueda acceder a los libros que ha escrito.

¿Cómo realizar migraciones para actualizar la base de datos?

Después de modificar el modelo, es necesario actualizar la base de datos para reflejar estos cambios. Eso se logra mediante la creación de una nueva migración y luego aplicarla:

python manage.py makemigrations
python manage.py migrate

Estas instrucciones se ejecutan en la terminal y aseguran que la base de datos esté sincronizada con los cambios en el modelo.

¿Cómo crear y guardar autores en la base de datos?

Una vez que el modelo está listo y migrado, podemos comenzar a crear instancias de Autor y almacenarlas en la base de datos:

Audrey = Autor(nombre='Audrey', birth_date='1980-01-01')
Audrey.save()

Pydanny = Autor(nombre='Pydanny', birth_date='1975-05-05')
Pydanny.save()

Aquí, creamos dos autores, Audrey y Pydanny, especificando su nombre y fecha de nacimiento antes de guardar sus instancias en la base de datos con el método save().

¿Cómo asignar autores a un libro?

Para asociar los autores con un libro específico, utilizamos el método set() para establecer la relación en el campo many-to-many:

book = Book.objects.first()
authors_list = [Audrey, Pydanny]
book.authors.set(authors_list)

Es importante pasar una lista de autores al método set(), ya que espera un iterable como argumento.

¿Cómo verificar las relaciones en la base de datos?

Para revisar la relación y verificar que todo esté configurado correctamente, se pueden ejecutar consultas SQL en la base de datos:

SELECT * FROM my_first_app_authors;
SELECT * FROM my_first_app_book_authors;

Esto permite observar los registros de la tabla authors y la tabla intermedia book_authors, donde se gestionan las relaciones entre libros y autores a través de sus IDs.

Este enfoque no solo simplifica el manejo de relaciones complejas, sino que también proporciona una manera robusta de trabajar con datos relacionales en los proyectos. Continúa explorando estas capacidades para obtener una base sólida en el desarrollo de aplicaciones con bases de datos relacionales.

Aportes 10

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Es en el minuto 7 con 22 segundos y en el mismo minuto 7 con 43 segundos pero son en tiempos donde el profe no esta hablando por lo que no interfiere con la explicación.
Es cosa mia, o se escucha como interferencias en el audio...👀
related\_name se utiliza para la relación inversa por lo que si se definió el field authors en la clase Book, lo correcto sería que el related\_name seria books y no authors.
Igual me encontré con el tema del audio. Descartados los fantasmas. Como información adicional para el team estoy viendo el video en Safari
Efectivamente, hay ruido en el video: 7:33 y 7:43; no pasa nada, pero llama la atención que a ésta fecha no esté solucionado...
Veo que a profe le pasa mucho que olvida guardar los cambios, si también te sucede como a todos en algún momento y si están utilizando Visual Studio Code, pueden irse a las settings y les aparecerá en los primeros campos autosave o auto guardado y allí pueden seleccionar el que más les convenga, bien sea cuando se cambian de archivo, cuando ya no tienen el focus en el archivo entre otras opciones.
En Django, para relaciones 1:N (uno a muchos), se utiliza `ForeignKey`. Por ejemplo, en un modelo `Libro`, se puede tener un campo `author = models.ForeignKey(Autor, on_delete=models.CASCADE)`. Para relaciones N:N (muchos a muchos), se utiliza `ManyToManyField`. Por ejemplo, en el modelo `Libro`, puedes tener `autors = models.ManyToManyField(Autor, related_name='libros')` para permitir que un libro tenga múltiples autores y viceversa.
**Relación muchos a muchos** * Los libros pueden ser escritos por más de un autor * y los autores pueden tener más de un libro Allí es donde aparecen estas relaciones: ![](https://static.platzi.com/media/user_upload/image-db41b41d-ab29-4585-b912-bd3594f1d5c8.jpg)![](https://static.platzi.com/media/user_upload/image-3881df5e-139e-4107-8d30-f1a334a5b93e.jpg)
para practicar el english: <u>Summary</u> Extending the "books" example to introduce the **many to many (N:N) relationships between models (entities)** <u>How so? 🤨</u> Well ... > Books can be written by more than one Author and > every Author can write more than one Book. . <u>Practical example </u> If we wanted to add a book with more than an author in our Django app as it is... we couldn't 😣 * First, we need to make some modifications to our database structure. As before, this starts from the models.py file, in which we will: **1. Create the new Author class(model)** ```python class Author(models.Model): name = models.TextField(max_length=255) birth_date = models.DateField() def __str__(self): return self.name ```class Author(models.Model): name = models.TextField(max\_length=255) birth\_date = models.DateField() def \_\_str\_\_(self): return self.name \--- > **IMPORTANT**: We need to declare Author before Book, because... **2. Book will now receive an *authors* field (PLURAL)** which we will define as a **'ManyToManyField'**, giving it 2 parameters: * The **name** of the model|class to which we're setting the relation to * A custom **string** to refer to this field from that chosen model|class, through the **'related\_name'** attribute. **3. Changes are done. Time to update them to the database** * Save changes! * Terminal: `./ manage.py makemigrations` `./ manage.py migrate` \--- 03:00 1. **The database is ready to receive our multi-authored books!** (and multi-books authors? 😐 ) * Open new terminal, enter the shell `./ manage.py shell ` * Import the models `from my_first_app.models import Book, Publisher, Author` * Instantiate and save the authors (couldn't find the real birthday 🫠) `audry = Author(name='Audrey', birth_date='1975-01-10')` `audry.save()` `pydanny = Author(name='Pydanny', birth_date='1972-03-21')` `pydanny.save()` <u>Accessing through the shell</u> > If we were to try, through this new terminal, we *wouldn't be able* to <u>access</u> our **book** variable * But it is possible to reach it like: `book= Book.objects.first()` > What about its authors field: `book.authors` this will output a specification of the field as a `ManyRelatedManager` *more on that later.* \--- **<u>5. Connecting the authors to the book</u>** > Now we'll use the `.set `method to add our new authors to the book. * This method receives a list, so we'll need to create it `authors_list = [pydanny, audry]` * and then insert them `book.authors.set(authors_list)` \--- 1. **DB Verification** We can then exit the **shell**, go to the **dbshell** and verify the addition of * the authors themselves `select * from my_first_app_author` * the new list on authors on the book `select * from my_first_app_book_authors` > this will output only numbers, which are ID numbers, with the next order: *ID of the relationship | ID for which book | ID for which author.* `1|1|3` `2|1|4`
de igual manera el uso del atributo related\_name puede ser utilizado en los campos tipo Foreignkey y OneToOne y tiene la misma funcionalidad que en el ManyToMany