01-使用SerializerMethodField 来优化不必要的查询

class RepairQueueSerializer(serializers.ModelSerializer):
# rq_base = serializers.CharField()
tasks_not_finish = serializers.SerializerMethodField()
tasks_wait_for = serializers.SerializerMethodField()
tasks_finish = serializers.SerializerMethodField() class Meta:
model = models.RepairQueue fields = ('rqid', 'rq_type', 'rq_desc', 'rq_level', 'rq_time', 'rq_user', 'rq_contact', 'rq_status',
'rq_report', 'rq_tasks_choice', 'rq_work_status', 'tasks_not_finish', 'tasks_wait_for', 'tasks_finish') def get_tasks_not_finish(self, obj):
return models.RepairQueue.objects.filter(rq_tasks_choice='未完成').count() def get_tasks_wait_for(self, obj):
return models.RepairQueue.objects.filter(rq_tasks_choice='待验收').count() def get_tasks_finish(self, obj):
return models.RepairQueue.objects.filter(rq_tasks_choice='已完成').count() def create(self, validated_data):
validated_data['rqid'] = DBHelper.get_id('uni_repairqueue', 'WYWX')
return models.RepairQueue.objects.create(**validated_data)

添加一个 get_tasks_not_finish 方法,这个方法的命名规则就是在上面声明的属性前面加上个 “get_” 前缀,并接受一个 obj 参数,这个 obj 参数就是当前的 models.RepairQueue 对象实例。

1. serializer可以做逻辑上的操作,然而最好不要做查询(你可以用SerializerMethodField做一些数据转换例如0变为假1变为真什么的,然而最好不要做复杂的数据库查询),这种事情可以在view上做好(注意可以用select_related减少多次查询),
因为这是每一个model都要serializer一次。 2. 如果说跟前端对的修改和查询使用不同的serializer,那么你就写两个,不希望修改的字段加上readonly(或者放在readonly_fields里面)

02-使用 SerializerMethodField 获取关联的model的字段

对于外键字段实现显示被关联的字段而不是id

例:外键

class CommentSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField('get_user_name') class Meta:
model = Comment
fields = ('name', 'create_time', 'text') def get_user_name(self, obj):
return obj.author.nickname

如上图,obj是对应的模型,此处是Comment。author是Comment的ForeignKeyField,nickName是Author的一个字段。

例:多对多

def get_who_like_it(self, obj):
return [author.nickname for author in obj.like.all()]

参考:https://blog.csdn.net/csdn_yi_e/article/details/86475587

最新文章

  1. ASP.Net MVC3 图片上传详解(form.js,bootstrap)
  2. windows配置xhprof,PHP性能分析工具
  3. web系统登陆页面增加验证码
  4. google应用商店的解决
  5. EntityFramework:支持同一事务提交的批量删除数据实现思路
  6. equals方法
  7. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
  8. 【转】ipad死机了,无法退出,也无法关机,怎么办
  9. Android安卓身份证识别SDK
  10. postgresql的psql常用命令-4
  11. TP框架自带的正则验证的规则
  12. Android 自定义ViewGroup手把手教你实现ArcMenu
  13. Git版本控制 —— IDE工具(IDEA)
  14. Mysql 的 create as 和create like 区别
  15. react-native 导航器 react-navigation 3.x 使用
  16. spring05-Spring事务管理
  17. 游记-NOIP2018
  18. x学生管理系统(用中间件)-------基于FORM组件
  19. [转载]资深程序员点评当前某些对Lotus Domino 的不实评论
  20. matlab学习(3) 保存和导入工作区

热门文章

  1. ==运算符和equals()方法的区别
  2. js node.js 编写命令工具demo
  3. Python基础(set集合)
  4. Fescar(Seata)-Springcloud流程分析-2阶段
  5. RDIFramework.NET V3.3 WinForm版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
  6. Flutter 即学即用系列博客——06 超实用 Widget 集锦
  7. FeignClient注解及参数
  8. SpringMVC与Struts2的主要区别
  9. Java基础-异常、断言
  10. IntelliJ IDEA下的使用git