Django 表与表之间的关系

Django 表与表之间的关系,关系型数据库的表与表之间往往存在一定的关系,由于Django的模型是数据库表与Python类之间的映射,因此Django提供了对3种最常用的数据库表之间关系的支持:多对一、多对多、一对一。

多对一关系

多对一关系是一张数据表中的多条记录与另一张数据表中的一条记录相关的关联模式。在关系型数据库中通常使用外键来表示多对一关系,Django模型中的ForeignKey字段就是模型的外键。
与其他模型字段的使用基本相同,唯一不同之处是FoieignKey字段的第一个参数是与当前模型相关的类。例如,前面示例代码中的Choice类的外键是Question类:

class Question(models.Model):
    ...
class Choice(models.Model):
    question = models.Foreignkey(Question, on_delete=models.CASCADE)

在问卷调查系统中,每一个调查问卷都可以包含多个选项,而每一个选项只能属于一个调查问卷,因此选项与问卷之间就形成了多对一的关系。

在数据库中查看polls_choice表结构,如图所示。
Django 表与表之间的关系

虽然在模型Choice中并没有定义question_id字段,但是Django自动创建了question_id字段作为Choice的外键。

多对多关系

另一种比较常见的数据库表之间的关系是多对多关系,如用户和用户组之间的关系通常就是多对多关系,例如一家公司有很多员工,每一个员工都属于一个或多个部门,每个部门又会包括一个或多个员工,此时员工与部门之间就构成了多对多的关系。

下图是一张简单的人力资源表,表中的公司有3个部门:销售部、研发部、管理部,其中销售部的郝总与研发部的郑总又同时属于公司管理部。
Django 表与表之间的关系

此时可以通过ManyToManyField字段类型实现以上组织架构:

from django.db import models
class Department(models.Model):
    name = models.CharField(max_length=50)
class Employee(models.Model):
    departments = models.ManyToManyField(Department)
    name = models.CharField(max_length=50)

Django自带的Auth模块中存在大量多对多的数据关系,例如用户与用户组之间、用户与用户权限之间、用户组与用户权限之间就是多对多关系。对于多对多关系,Django会在数据库中额外创建一张关系表,关系表的命名规则是:应用程序名模型1名模型2名s,例如用户与用户组的关系表就叫作auth_user_groups,数据库中查看auth_user_groups表结构,如图所示。
Django 表与表之间的关系

在Django中使用多对多关系时,有以下几条建议:

  • 多对多字段名使用复数形式。
  • 可以在两个有多对多关系的模型中的任意一个模型中定义多对多字段,但是不能同时在两个模型中都定义多对多字段。

一对一关系

这种映射关系用得比较少,Django使用OneToOneField表示一对一关系。

一对一关系的一个比较常用的场景是根据一张表的主键对这张表进行扩展,例如对Django自带的user表进行扩展,为每一个用户数据添加额外信息。

与前两种关系字段的使用相同,OneToOneField也要求第一个参数是模型类名。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!