DRF 外键字段深度查询优化、ListSerializer辅助完成群改
一、Response封装
用def自带的response模块返回数据需要data和status等参数,就算有相同的response也需要重新写一遍,这样显得很不方便。
因此我们可以将response模块进行二次封装,减少一些代码的重复书写,这样就可以使我们的工作量变小。
方法:
在应用文件夹中重新写一个response.py文件,专门用来二次封装drf的response模块。
class APIResponse(Response):
def __init__(self, status=0, msg='ok', results=None, http_status=None,headers=None, exception=False, content_type=None, **kwargs):
# 将status、msg、results、kwargs格式化成data
data = {
'status': status,
'msg': msg,
}
# results只要不为空都是数据:False、0、'' 都是数据 => 条件不能写if results
if results is not None:
data['results'] = results
# 将kwargs中额外的k-v数据添加到data中
data.update(**kwargs)
super().__init__(data=data, status=http_status, headers=headers, exception=exception, content_type=content_type)
二、外键字段深度查询
1、序列化配置exclude、depth
必须有子序列化类配合,不能反序列化了。
只能在序列化中使用。
字段名必须是外键(正向反向)字段。
- 因为相对于自定义序列化外键字段,自定义序列化字段是不能参与反序列化的,而子序列化必须为外键名,所以就无法入库。
在外键关联数据是多条时,需要明确many=True。
是单向操作,因为作为子系列的类必须写在上方,所以不能产生逆方向的子序列化。
class PublishModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Publish
# fields = ['name', 'address', 'books']
# 了解配置
# fields = '__all__' # 所有字段
exclude = ['name'] # 排除字段
depth = 2 # 自动深度,值代表深度次数,但是被深度的外键采用__all__,显示所有字段
2、模型层函数、插拔式字段查询
设置模型表中需要进行序列化和反序列化的字段(容器,列表或元组)。
并且容器中的名称可以映射到模型类中不存在任何参数的属性或方法,通过这种特性可以完成自定义字段的插拔式设计。
# models.py
class Car(models.Model):
name = models.CharField(max_length=64,unique=True)
price = models.DecimalField(max_digits=10,decimal_places=2)
image = models.ImageField(upload_to='img',default='img/default.jpg')
brand = models.CharField(max_length=32,default='unknown')
@property # 可以不写
def image_path(self): # 该方法不能携带参数
return f'{settings.BASE_URL}{settings.MEDIA_URL}{self.image}'
# serializer.py
class CarModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Car
fields = [
'name','price','image_path','brand'
]
三、listserializer辅助类
ListSerializer类能够序列化和一次验证多个对象。你通常不需要直接使用ListSerializer,而是应该在实例化一个序列化器时简单地传递一个many=True参数。
当一个序列化器在带有many=True选项被序列化时,将创建一个ListSerializer实例。该序列化器类将成为ListSerializer类的子类。
当你要自定义多个对象的更新行为(群改)时,你需要手动定制ListSerializer类的一些行为。
可以通过使用序列化器类的Meta类下面的list_serializer_class选项来修改当many=True时正在使用的类。
# 多表操作
class CarListSerializer(serializers.ListSerializer):
# 自定义的群增群改辅助类,没有必要重写create方法
def create(self, validated_data):
return super().create(validated_data)
def update(self, instance_list, validated_data_list):
return [
self.child.update(instance_list[index], attrs) for index, attrs in enumerate(validated_data_list)
]
# 汽车表序列化
class CarModelSerializer(serializers.ModelSerializer):
# 通过SerializerMethodField设置的字段为只读字段
car_color = serializers.SerializerMethodField()
def get_car_color(self,obj):
return obj.get_color_display()
re_brand = serializers.CharField(
write_only=True,
error_messages={
'required':'re_brand为必填字段!'
}
)
class Meta: # 声明
# 绑定需要进行序列化和反序列化的模型表
model = models.Car
# 设置模型表中需要进行序列化和反序列化的字段(容器,列表或元组)。
# 并且容器中的名称可以映射到模型类中不存在任何参数的属性或方法,
# 通过这种特性可以完成自定义字段的插拔式设计
fields = [
'name','car_color','price','image_path','brand','re_brand'
]
read_only_fields = ['car_color','image_path']
# 设置额外的序列化与反序列化的规则
extra_kwargs = {
'name':{
'min_length':2,
'max_length':10,
'error_messages':{
'min_length': '太短',
'max_length': '太长',
}
}
}
def validate(self, attrs):
brand = attrs.get('brand')
re_brand = attrs.pop('re_brand',False)
if not brand == re_brand:
raise serializers.ValidationError({'re_brand':'两次品牌不一致!'})
return attrs
DRF 外键字段深度查询优化、ListSerializer辅助完成群改的更多相关文章
- 01.drf文档及外键字段反序列化
一 安装drf 1.1 安装库 pip install djangorestframework pip install markdown # Markdown support for the brow ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- MS SQL巡检系列——检查外键字段是否缺少索引
前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作
我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却 ...
- django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段
在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结 ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作
http://www.cnblogs.com/wuhuacong/p/3872890.html 我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起 ...
- day08 外键字段的增删查改
day08 外键字段的增删查改 今日内容概要 外键字段的增删查改 正反向查询的概念 基于对象的跨表查询(子查询) 基于双下划线的跨表查询(连表操作) 聚合查询与分组查询 F查询和Q查询 前提准备 cl ...
- django【ORM】 通过外键字段找对应类
两个方法其实是一种,用哪个都行,看实例: 方法一: 从list_filter中的字符串,找到model对象的字段,然后得到这个外键对应的类 循环,把list_filter中对应的类所有对象 方法二 ...
- MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结
1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter ...
随机推荐
- Codeforces750E. New Year and Old Subsequence (线段树维护DP)
题意:长为2e5的数字串 每次询问一个区间 求删掉最少几个字符使得区间有2017子序列 没有2016子序列 不合法输出-1 题解:dp i,p(0-4)表示第i个数匹配到2017的p位置删掉的最少数 ...
- 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?
前言 micrometer中自带了很多其他框架的指标信息,可以很方便的通过prometheus进行采集和监控,常用的有JVM的信息,Http请求的信息,Tomcat线程的信息等. 对于一些比较活跃的框 ...
- Jpress小程序
首页轮播.首页公告.首页宫格.个人中心页面均支持在PC后台设置内容 首页列表.分类列表页.搜索列表的文章展示页均支持后台设置,拥有三种风格 所有分类展示支持两种风格 用户中心授权登陆,查看个人数据 J ...
- kubernetes实战-交付dubbo服务到k8s集群(二)交付jenkins到k8s集群
首先下载jenkins镜像并上传到我们自己的私有仓库:7-200 # docker pull jenkins/jenkins:2.190.3 # docker tag 22b8b9a84dbe har ...
- 数据库之ODPS中sql语句指南
此篇博文为本人在实际工作中应用总结,转载请注明出处. 持续更新中 一.增 1.增加一列(向csp_hsy_count_info表中增加sale_qty列) ALTER TABLE csp_hsy_co ...
- ArcGIS处理栅格数据(一)
一.建立影像金字塔 ArcToolbox--数据管理工具--栅格--栅格属性--构建金字塔(pyramid) 说明:该方式一次只能为一张影像数据建立影像金字塔. ArcToolbox--数据管理工具- ...
- 使用SignTool对软件安装包进行数字签名(一)--制作证书
一.制作根证书 1.开始菜单-运行-输入cmd,弹出命令行窗体. 2.输入命令:cd /d F:\SignTool,将当前工作目录修改到SignTool路径下. 3.使用makecert命令制作证书, ...
- c# 类(4)
原文链接:https://csharp.net-tutorials.com/classes/visibility/ 可见性 Visibility 可见性 控制的是 访问权限的问题.最常见的就是priv ...
- 2019牛客多校第五场C generator 2(BSGS)题解
题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...
- Gym 101128A Promotions(思维 + dfs)题解
题意:给一有向图,如果A指向B,则A是B的上级.一直i要升职那么他的上级必须都升职.现在给你一个升职人数的区间[a, b],问你升职a人时几个人必被升职,b时几个人必升职,b时几个人没有可能被升职. ...