在 Django 中表示一对多关系
数据库几乎在任何地方都发挥着关键作用,Web 开发就是这样一个地方也就不足为奇了。使用 SQL 构建表和设置表之间的关系是一项简单的任务,但 Django 使它变得更加简单。
本文将介绍如何在 Django 中表示一对多关系。
使用连接点/中介模型表示一对多关系
请参考以下模型的定义。
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")
Number
模型有一个字段 number
来存储电话号码。
Person
模型有一个字段 name
表示人名。
PersonNumber
是 Number
和 Person
的结点或中介模型。外键与引用的对象具有级联关系。该模型可用于建立一对多关系以及多对多关系。
所有模型的默认主键是 id
,一个整数自动字段。
由于一个电话号码只与一个人相关联,但一个人可以有多个电话号码,这是一对多的关系。PersonNumber
将用于表示这种关系。
如果变量 person
存储一个 Person
对象,我们可以使用以下语句轻松访问此人的所有电话号码。
numbers = person.numbers.objects.all()
此语句将返回 Number
对象的 QuerySet
。
考虑这个例子。
ID | Person | Number |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |
7 | 3 | 7 |
一个有 id
1
的人有四个电话号码,分别是 id
1
、2
、3
和 4
。
一个有 id
2
的人有两个电话号码,分别是 id
5
和 6
。
一个 id
3
的人只有一个 id
7
的电话号码。
使用外键表示一对多关系
请参考以下模型的定义。
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)
Person
模型有一个字段 name
表示人名。
Number
模型有一个字段 number
来存储电话号码和对 Person
模型的外键引用。此字段将存储此号码的所有者。外键与引用模型 Person
具有级联关系。
使用这种结构,我们可以使用外键引用轻松地将每个 Number
对象与其各自的所有者相关联。
如果变量 person
存储一个 Person
对象,我们可以使用以下语句访问与此人关联的所有数字。
numbers = Number.objects.filter(person=person)
该语句将返回一个 Number
对象的 QuerySet
。