Representar una relación de uno a muchos en Django

Vaibhav Vaibhav 30 enero 2023
  1. Representar la relación de uno a muchos utilizando un modelo de unión / intermedio
  2. Representar relaciones de una a varias mediante claves externas
Representar una relación de uno a muchos en Django

Las bases de datos juegan un papel clave en casi todas partes, y no sorprende que el desarrollo web sea uno de esos lugares. Construir tablas y establecer relaciones entre tablas usando SQL es una tarea simple, pero Django lo hace aún más simple.

Este artículo presentará cómo representar una a varias relaciones en Django.

Representar la relación de uno a muchos utilizando un modelo de unión / intermedio

Consulte las definiciones de los siguientes modelos.

class Number(models.Model):
    number = models.CharField(max_length=10)


class Person(models.Model):
    name = models.CharField(max_length=200)


class PersonNumber(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
    number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")

El modelo Number tiene un campo number para almacenar un número de teléfono.

El modelo Person tiene un campo name para el nombre de la persona.

PersonNumber es un modelo intermedio o de unión para Number y Person. Las claves foráneas tienen una relación en cascada con los objetos referidos. Este modelo se puede utilizar para establecer una relación de uno a varios, así como una relación de varios a varios.

La clave primaria predeterminada para todos los modelos es id, un campo automático de enteros.

Dado que un número de teléfono solo está asociado con una sola persona, pero una persona puede tener más de un número de teléfono, esta es una relación de uno a varios. Se utilizará PersonNumber para representar esta relación.

Si una variable person está almacenando un objeto Person, podemos acceder fácilmente a todos los números de teléfono de esta persona utilizando la siguiente declaración.

numbers = person.numbers.objects.all()

Esta declaración devolverá un QuerySet de objetos Number.

Considere este ejemplo.

ID Person Number
1 1 1
2 1 2
3 1 3
4 1 4
5 2 5
6 2 6
7 3 7

Una persona con id 1 tiene cuatro números de teléfono con id 1, 2, 3 y 4.
Una persona con id 2 tiene dos números de teléfono con id 5 y 6.
Una persona con id 3 solo tiene un número de teléfono con id 7.

Representar relaciones de una a varias mediante claves externas

Consulte las definiciones de los siguientes modelos.

class Person(models.Model):
    name = models.CharField(max_length=200)


class Number(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    number = models.CharField(max_length=10)

El modelo Person tiene un campo name para el nombre de la persona.

El modelo Number tiene un campo number para almacenar un número de teléfono y una referencia de clave externa al modelo Person. Este campo almacenaría el propietario de este número. La clave externa tiene una relación en cascada con el modelo referenciado, Person.

Usando esta estructura, podemos asociar fácilmente cada objeto Number con su propietario respectivo usando la referencia de clave externa.

Si una variable person está almacenando un objeto Person, podemos acceder a todos los números asociados con esta persona utilizando la siguiente declaración.

numbers = Number.objects.filter(person=person)

Esta declaración devolverá un QuerySet de objetos Number.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.