Django框架之ORM多表关联操作
Posted xuchengnotes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架之ORM多表关联操作相关的知识,希望对你有一定的参考价值。
一、创建基表
设置了abstract为True的模型类,称之为基表,这样的模型类是专门作为基类来提供公有属性的
- Model类的内部配置Meta类要设置abstract=True
# Model类的内部配置Meta类要设置abstract=True,这样的Model类就是用来作为基表
from django.db import models
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
# 类中在定义一个类就代表是配置,约定俗成都叫Meta
class Meta:
# 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
abstract = True
class Book(BaseModel):
...
二、ORM多表关联操作
'''
外键所放位置
一对多:外键放在多的一方
多对多:外键放在常用的一方
一对一:外键放在不常用的一方
外键字段为正向查询字段,related_name是反向查询字段(别名)
外键如何断关联
设置外键字段db_constraint=False
外键间的级联关系
一对一:作者没了,详情也没:on_delete=models.CASCADE
一对多:出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
一对多:部门没了,员工没有部门(空部门):null=True, on_delete=models.SET_NULL
一对多:部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
多对多:不能设置on_delete
'''
重点:
一对一外键:应该设置在关联方的表中。因为是先有被关联表,再有关联表。
外键字段为正向查询字段,related_name是反向查询字段(别名)
author = models.OneToOneField( to="Author",related_name="detail",db_constraint=False, on_delete=models.CASCADE )
外键如何断关联:db_constraint=False
实例:
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
# 类中在定义一个类就代表是配置,约定俗成都叫Meta
class Meta:
# 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
abstract = True
class Book(BaseModel):
name = models.CharField(max_length=16)
price = models.DecimalField(max_digits=9,decimal_places=2)
# 设置外键字段,取反向查除的别名,断开连接,不设置级联删除
publish = models.ForeignKey(
to="Publish",related_name="books",db_constraint=False,
on_delete=models.DO_NOTHING
)
# 重点:多对多外键实际在关系表中,ORM默认关系表中两个外键都是级联
# ManyToManyField字段不提供设置on_delete,如果想设置关系表级联,只能手动定义关系表
authors = models.ManyToManyField(
to="Author",related_name="books",db_constraint=False
)
class Publish(BaseModel):
name = models.CharField(max_length=16)
address = models.CharField(max_length=64)
class Author(BaseModel):
name = models.CharField(max_length=16)
sex = models.IntegerField(choices=[(0, '男'),(1, '女')], default=0)
class AuthorDetail(BaseModel):
mobile = models.CharField(max_length=11)
# 有作者可以没有详情,删除作者,详情一定会被级联删除
# 外键字段为正向查询字段,related_name是反向查询字段
author = models.OneToOneField(
to="Author",related_name="detail",db_constraint=False,
on_delete=models.CASCADE
)
以上是关于Django框架之ORM多表关联操作的主要内容,如果未能解决你的问题,请参考以下文章
第六模块:WEB框架开发 第1章·Django框架开发50~100
python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)