Django模型中的Python关系字段
Django模型代表现实世界的实体,而现实世界的实体很少是完全独立的。因此,Django支持关系型数据库,允许我们在不同的模型之间建立关系。Django支持的关系域有三种类型:多对一、多对多和一对一。
Many-to-one 字段:
例如,模型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)
用与相关模型相同的名称来命名多对一字段是一个好的做法,小写。
Many-to-many 字段:
当一个模型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)
用相关模型的复数版本来命名多对多字段是一个好的做法,小写。两个模型中的哪一个包含多对多字段并不重要,但它不应该被放在两个模型中。
One-to-one 字段:
当一个模型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分配给关系字段,前提是null = True被设置。
- on_delete = models.SET_DEFAULT – 当一条记录被删除时,它为关系字段分配默认值,必须提供一个默认值。
- on_delete = models.SET() – 它可以接受一个默认值作为参数,也可以是一个可调用的,其返回值将被分配给字段。
- on_delete = models.DO_NOTHING – 不采取任何行动。使用这个值是一个不好的做法。