在 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。
