在 Django 中表示一对多关系

Vaibhav Vaibhav 2023年1月30日
  1. 使用连接点/中介模型表示一对多关系
  2. 使用外键表示一对多关系
在 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 表示人名。

PersonNumberNumberPerson 的结点或中介模型。外键与引用的对象具有级联关系。该模型可用于建立一对多关系以及多对多关系。

所有模型的默认主键是 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 1234
一个有 id 2 的人有两个电话号码,分别是 id 56
一个 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

作者: Vaibhav Vaibhav
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.