Django模型中的关系:一对一、一对多与多对多
数据库中的表存在关联关系,Django中的模型对应数据库中的表,因此Django中的模型也存在一对一、一对多与多对多这三种关系。
1 . 一对一关系
比如用户基本信息模型类与用户拓展信息模型类,是一对一关系,在模型中用 models.OneToOneField() 来构建模型与模型的一对一关系。
1.1 OneToOneField()的参数
参数 | 参数含义 |
---|---|
to | 要进行关联的模型名称 |
to_field | 要进行关联的字段名称(字符串) |
on_delete | 删除关联表中数据时要执行的操作配置项 |
1.2 on_delete参数配置选型
配置选项 | 配置选项含义 |
---|---|
models.CASECADE | 删除基本信息表时,一并删除拓展信息表中的内容 |
models.PROTECT | 删除基本信息表时抛出错误,不删除拓展表中的内容 |
models.SET_NULL | 删除时,如果关联表中字段属性设置为null=True时,将此字段内容置空 |
models.SET_DEFAULT | 设置为默认值 |
models.SET | 设置为指定值 |
models.DO_NOTHING | 删除基本信息表时,对关联表不做任何操作 |
2. 一对多关系
一个用户可以有多个兴趣爱好,用户表与用户爱好表是一对多关系,在模型中用 models.ForeignKey() 方法来构建模型的一对多关系。
2.1 ForeignKey()的参数
参数 | 含义 |
---|---|
to | 要进行关联的模型名称 |
to_field | 要进行关联的字段名称 |
on_delete | 删除关联表中数据时要执行的操作配置项 |
related_name=None | 在反向操作时使用的字段名,用于替代[表名_set]。如obj.表名_set.all() |
related_query_name=None | 在反向操作时,使用的连接前缀,用以替换表名 |
db_constraint=True | 是否在数据库中创建外键约束 |
一对多关系中,一般将ForeignKey()放到多的数据表对应的模型中。
3. 多对多关系
手机型号与手机颜色是多对多关系,一个手机型号可以对应多种颜色,一种颜色也可对应于多种手机型号。在模型中,用 models.ManyToManyField()方法构建模型的多对多关系。
3.1 ManyToManyField()的参数
参数 | 含义 |
---|---|
to | 要进行关联的模型名称 |
db_constraint=True | 是否在数据库中创建外键约束 |
db_table=None | 默认创建的多对多关系表名 |
ManyToManyField()方法中没有on_delete参数,db_table参数表示模型迁移后生成的多对多关系的表名,如果不设定,则默认生成的表名为两个模型名称的相加。