Representar una relación de uno a muchos en Django
- Representar la relación de uno a muchos utilizando un modelo de unión / intermedio
- Representar relaciones de una a varias mediante claves externas
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
.