Representam o relacionamento de um para muitos no Django
- Representar o relacionamento de um para muitos usando um modelo de junção / intermediário
- Representar relacionamentos de um para muitos usando chaves estrangeiras
Os bancos de dados desempenham um papel fundamental em quase todos os lugares, e não é surpresa que o desenvolvimento web seja um desses lugares. Construir tabelas e configurar relacionamentos entre tabelas usando SQL é uma tarefa simples, mas o Django torna ainda mais simples.
Este artigo irá apresentar como representar um para muitos relacionamentos no Django.
Representar o relacionamento de um para muitos usando um modelo de junção / intermediário
Consulte as seguintes definições dos 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")
O modelo Number
possui um campo number
para armazenar um número de telefone.
O modelo Person
possui um campo name
para o nome da pessoa.
PersonNumber
é uma junção ou modelo intermediário para Number
e Person
. As chaves estrangeiras têm um relacionamento em cascata com os objetos referidos. Este modelo pode ser usado para configurar um relacionamento um-para-muitos, bem como um relacionamento muitos-para-muitos.
A chave primária padrão para todos os modelos é id
, um campo automático inteiro.
Como um número de telefone está associado apenas a uma única pessoa, mas uma pessoa pode ter mais de um número de telefone, esse é um relacionamento de um para muitos. PersonNumber
será usado para representar esta relação.
Se uma variável person
está armazenando um objeto Person
, podemos acessar facilmente todos os números de telefone dessa pessoa usando a seguinte instrução.
numbers = person.numbers.objects.all()
Esta instrução retornará um QuerySet
de objetos Number
.
Considere este exemplo.
ID | Person | Number |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |
7 | 3 | 7 |
Uma pessoa com id
1
tem quatro números de telefone com id
1
, 2
, 3
e 4
.
Uma pessoa com id
2
tem dois números de telefone com id
5
e 6
.
Uma pessoa com id
3
tem apenas um número de telefone com id
7
.
Representar relacionamentos de um para muitos usando chaves estrangeiras
Consulte as seguintes definições dos 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)
O modelo Person
possui um campo name
para o nome da pessoa.
O modelo Number
possui um campo number
para armazenar um número de telefone e uma referência de chave estrangeira para o modelo Person
. Este campo armazenaria o dono deste número. A chave estrangeira tem um relacionamento em cascata com o modelo referenciado, Person
.
Usando esta estrutura, podemos facilmente associar cada objeto Number
com seu respectivo proprietário usando a referência de chave estrangeira.
Se uma variável person
está armazenando um objeto Person
, podemos acessar todos os números associados a essa pessoa usando a seguinte instrução.
numbers = Number.objects.filter(person=person)
Esta instrução retornará um QuerySet
de objetos Number
.