📜  Python| Django 模型中的关系字段

📅  最后修改于: 2022-05-13 01:55:25.801000             🧑  作者: Mango

Python| Django 模型中的关系字段

先决条件:Django 模型


Django 模型代表现实世界中的实体,现实世界中的实体很少会完全相互独立。因此 Django 支持关系数据库并允许我们在不同模型之间建立关系。 Django 支持三种类型的关系字段:多对一、多对多和一对一。

多对一字段:

这用于模型 A 的一条记录与另一个模型 B 的多条记录相关。例如 - 模型Song与模型Album具有多对一关系,即一张专辑可以有很多歌曲,但一首歌不能成为多张专辑的一部分。使用django.db.modelsForeignKey字段定义多对一关系。

下面是一个演示相同的示例。

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.modelsManyToManyField字段定义的。

下面是一个演示相同的示例。

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.modelsOneToOneField字段定义一对一关系。

下面是一个演示相同的示例。

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 – 不采取任何行动。使用此值是一种不好的做法。