Python| Django 模型中的关系字段
Django 模型代表现实世界中的实体,现实世界中的实体很少会完全相互独立。因此 Django 支持关系数据库并允许我们在不同模型之间建立关系。 Django 支持三种类型的关系字段:多对一、多对多和一对一。
多对一字段:
这用于模型 A 的一条记录与另一个模型 B 的多条记录相关。例如 - 模型Song与模型Album具有多对一关系,即一张专辑可以有很多歌曲,但一首歌不能成为多张专辑的一部分。使用django.db.models
的ForeignKey
字段定义多对一关系。
下面是一个演示相同的示例。
from django.db import models
class Album(models.Model):
title = models.CharField(max_length = 100)
artist = models.CharField(max_length = 100)
class Song(models.Model):
title = models.CharField(max_length = 100)
album = models.ForeignKey(Album, on_delete = models.CASCADE)
使用与相关模型相同的名称(小写)命名多对一字段是一种很好的做法。
多对多字段:
当模型 A 的一个记录与另一个模型 B 的多个记录相关时使用此选项,反之亦然。例如 - 模型Book与模型Author具有多对多关系,即一本书可以由多个作者编写,而一个作者可以编写多本书。多对多关系是使用django.db.models
的ManyToManyField
字段定义的。
下面是一个演示相同的示例。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length = 100)
desc = models.TextField(max_length = 300)
class Book(models.Model):
title = models.CharField(max_length = 100)
desc = models.TextField(max_length = 300)
authors = models.ManyToManyField(Author)
使用相关模型的复数版本(小写)命名多对多字段是一种很好的做法。两个模型中的哪个包含多对多字段无关紧要,但不应将它放在两个模型中。
一对一字段:
当模型 A 的一个记录与另一个模型 B 的一个记录恰好相关时使用此字段。如果该对象以某种方式扩展另一个对象,则该字段可用作对象的主键。例如 - 模型Car与模型Vehicle具有一对一的关系,即汽车是车辆。使用django.db.models
的OneToOneField
字段定义一对一关系。
下面是一个演示相同的示例。
from django.db import models
class Vehicle(models.Model):
reg_no = models.IntegerField()
owner = models.CharField(max_length = 100)
class Car(models.Model):
vehicle = models.OneToOneField(Vehicle,
on_delete = models.CASCADE, primary_key = True)
car_model = models.CharField(max_length = 100)
使用与相关模型的名称相同的名称(小写)命名一对一字段是一种很好的做法。
数据完整性选项:
由于我们正在创建依赖于其他模型的模型,因此当删除另一个模型中的相应记录时,我们需要定义一个模型中的记录的行为。这是通过在关系字段中添加一个可选的on_delete
参数来实现的,该参数可以采用以下值:
-
on_delete = models.CASCADE
– 这是默认值。当一条记录被删除时,它会自动删除所有相关记录。(例如,当一个专辑记录被删除时,与之相关的所有歌曲记录都将被删除) -
on_delete = models.PROTECT
– 它阻止删除与其他记录有关系的记录。(例如,任何删除专辑记录的尝试都将被阻止) -
on_delete = models.SET_NULL
– 如果设置了null = True
,则在删除记录时将 NULL 分配给关系字段。 -
on_delete = models.SET_DEFAULT
– 它在删除记录时为关系字段分配默认值,必须提供默认值。 -
on_delete = models.SET()
– 它可以采用默认值作为参数,也可以采用可调用对象,其返回值将分配给该字段。 -
on_delete = models.DO_NOTHING
– 不采取任何行动。使用此值是一种不好的做法。