二次封装Response、断关联、基表
在应用文件夹下新建response.py文件
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, status=0, msg='ok', http_status=None, headers=None, exception=False, **kwargs):
# 将外界传入的数据状态码、状态信息以及其他所有额外存储在kwargs中的信息,都格式化成data数据
data = {
'status': status,
'msg': msg
}
# 在外界数据可以用result和results来存储
if kwargs:
data.update(kwargs)
super().__init__(data=data, status=http_status, headers=headers, exception=exception)
二次封装的原因:


封装的原理:


使用:
# APIResponse() 代表就返回 {"status": 0, "msg": "ok"}
# APIResponse(result="结果") 代表返回 {"status": 0, "msg": "ok", "result": "结果"}
# APIResponse(status=1, msg='error', http_status=400, exception=True) 异常返回 {"status": 1, "msg": "error"}
二、断关联:
用法:外键字段中写入 db_constraint=False 参数

断关系后用to=... ,related_name='..' 来建立表与表之间的关系。

结果:

结论:两表之间有外键联系 与 两表之间没有联系(断联系)的区别:
1)两个表之间有关系,增删改操作会相互影响(效率低),查询操作就是正常的连表操作
2)两个表之间有关系,断开关联,但所有数据保持与原来一致,
且每个表都可以单独操作,增删改操作效率极高,但是容易出现脏数据 (开发中完全可以避免)
由于数据没有任何变化,所以查询的连表操作不会受到任何影响
3)Django的ORM支持断关联操作关系表,且所有的操作方式和没有断关联操作一致
例子:


三、
外键位置:
1)一对多:ForeignKey 必须放在 多的一方
2)多对多:ManyToManyField 放在任何一方都可以,因为会创建关系表,在关系表中用两个外键分别关联两个表
3)一对一:OneToOneField 放在依赖的表一方,作者与作者详情,放在详情表,OneToOneField会被转换为 外键 + 唯一约束
ORM关系Field:
ForeignKey 可以设置 related_name, db_constraint, on_delete
OneToOneField 可以设置 related_name, db_constraint, on_delete
ManyToManyField 只能设置 related_name, db_constraint
不能设置on_delete的原因:不管是关联的A表,还是B表,数据修改,都会影响到关系表(默认级联),
如果想控制,只能自定义关系表,在关系表的两个外键分别设置on_delete

参数含义
related_name: 表之间反向访问的名字,默认是 表名小写/表名小写_set
db_constraint: 表之间的关联关系,默认为True,代表关联。设置False,可以提高增删改的效率,且不影响查等其他操作
on_delete: 在django 1.x下默认是CASCADE,在django 2.x下必须手动明确
作者没,作者详情一定没: CASCADE *****
作者没,书还是该作者出的:DO_NOTHING
部门没,部门内的员工全部进入未分组部门: SET_DEFAULT (需要配合default属性使用)
部门没,部门内的员工部门外键字段设置为空:SET_NULL (需要配合null=True属性使用)


五、后台管理:admin



浙公网安备 33010602011771号