Relaciones de Muchos a Muchos en Modelos de Base de Datos
Resumen
¿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
classAutor(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:
classBook(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:
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:
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.
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.
ya que si queremos obtener todos los libros de un autor1, deberíamos hacer
(de acuerdo con el ejemplo)
autor1.authors.all()
cosa que no es intuitivo y, si lo hicieramos con related_name="books" la obtención de los libros de un autor sería
autor1.bools.all()
es correcta mi apreciación?
Gracias
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.
"La vida es eso que pasa mientras los computadores ejecutan comandos"
Suponiendo que el profe estuviera utilizando un filtro de IA para eliminar el ruido y que solo se escuchara su voz, esos ruidos pueden ser el resultado de la IA malinterpretando sonidos de fondo (como el teclado) como si fuera una voz.
La otra explicación con base científica que se me ocurre es que sean fantasmas
Es cosa mia, o se escucha como interferencias en el audio...👀
Escuché el video y no me pareció que haya interferencia, ¿puedes indicarme en que minuto escuchas la interferencia?
Uyy no me diga eso profe, andaba estudiando en la madrugada... hahaha.
Para este curso es muy importante bases solidas de bases de datos relacionadas, así, este contenido se hará muy fácil de digerir.
Igual me encontré con el tema del audio. Descartados los fantasmas.
Como información adicional para el team estoy viendo el video en Safari
En el ejemplo final del profesor hizo lo siguiente:
Creo dos autores.
Obtuvo un libro.
Paso como lista los dos autores a el libro.
Consulto el libro y este sale con el ID 1 del autor.
Consulto la tabla intermedia de la relación mucho a muchos. Y estaban dos registros de dos IDs de autores relacionados con un mismo libro.
Mi pregunta es, por que quedo el ID del autor 1 en el libro al consultar en la db? Es decir si entiendo el ejemplo es de una relación N:M. Siendo así las reglas del MER indican que:
Se crea una tabla intermedia(Se creo).
Se registran las PK de las tablas libros y autores(Se hizo) como FK a sus respectivas tablas(se hizo)
Según lo anterior, en la entidad libros en la DB y siguiendo el MER. No debe tener como FK al autor. Y si lo tiene, no debe ser solo el del ID 1. Por lo cual seria un 1:N y no un N:M
📚 Nombre de la clase
Relaciones uno a muchos (1:N) en Django
🎯 Idea principal
Una relación uno a muchos (1:N) ocurre cuando un registro de una tabla puede estar asociado con muchos registros de otra tabla, pero cada uno de esos registros pertenece solo a uno del primero. En Django, este tipo de relación se implementa utilizando una clave foránea (Foreign Key) dentro del modelo que representa el lado “muchos”.
⚡ Síntesis en 10 segundos
Relación 1:N conecta un registro con muchos otros.
Se implementa usando Foreign Key.
La clave foránea se coloca en el modelo del lado muchos.
Permite representar dependencias entre entidades.
Es una de las relaciones más comunes en bases de datos.
🔑 Puntos clave
Relación uno a muchos
Un elemento principal puede tener múltiples elementos asociados.
Foreign Key
Campo que crea la relación entre dos modelos.
Ubicación de la relación
La clave foránea se define en el modelo que representa el lado “muchos”.
Dependencia de datos
Cada registro del lado “muchos” pertenece a un registro del lado “uno”.
Consultas relacionadas
El ORM permite acceder fácilmente a los registros relacionados.
🧠 Conceptos importantes
Clave foránea
Campo que referencia el identificador de otro registro en otra tabla.
Entidad principal
Modelo que representa el lado “uno” de la relación.
Entidad dependiente
Modelo que pertenece al lado “muchos” de la relación.
Relación relacional
Conexión entre tablas que permite estructurar datos de forma organizada.
🧩 Modelo mental de la clase
Entidad principal
↓
Puede tener múltiples registros asociados
↓
El modelo dependiente guarda una Foreign Key
↓
La base de datos conecta ambas tablas
↓
La aplicación puede consultar datos relacionados fácilmente
Ejemplo conceptual:
Usuario
↓
Publicaciones del usuario
Un usuario puede tener muchas publicaciones.
🚀 Acciones inmediatas
Identificar entidades que tengan relación uno a muchos en un sistema.
Definir el modelo principal.
Crear el modelo dependiente con una Foreign Key.
Explorar cómo consultar registros relacionados.
💼 Aplicación profesional
Las relaciones 1:N aparecen en casi todos los sistemas:
usuarios → publicaciones
categoría → productos
autor → artículos
cliente → pedidos
Son fundamentales para diseñar estructuras de datos realistas en aplicaciones web.
🔥 Errores comunes
Colocar la clave foránea en el modelo incorrecto.
Confundir relación uno a muchos con muchos a muchos.
Diseñar modelos sin analizar primero las relaciones entre entidades.
No considerar cómo estas relaciones afectan las consultas del sistema.
📝 Reflexión estratégica
Las relaciones uno a muchos permiten representar jerarquías naturales de información dentro de una aplicación.
Comprender este tipo de relación es clave para diseñar bases de datos correctas, ya que muchos sistemas reales se construyen a partir de estructuras donde una entidad principal organiza múltiples elementos dependientes.
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:
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)
classAuthor(models.Model): name = models.TextField(max_length=255) birth_date = models.DateField()def__str__(self):return self.name
```classAuthor(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|classto 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:001.**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`
me lleva🙃
PD: equipo platzi!
hay un conflicto de nombres en esta clase
en el indice aparece como "Relaciones Uno a Muchos (1:N) "
La preview del comentario es bien mentirosa 🤥
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