首页 > 其他 > 详细

13 在 Django REST framework 善用 SerializerMethodField 来优化不必要的查询

时间:2019-04-19 15:58:05      阅读:235      评论:0      收藏:0      [点我收藏+]

 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()

添加一个 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

13 在 Django REST framework 善用 SerializerMethodField 来优化不必要的查询

原文:https://www.cnblogs.com/pgxpython/p/10736171.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!