zoukankan      html  css  js  c++  java
  • 13 在 Django REST framework 善用 SerializerMethodField方法

     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

  • 相关阅读:
    开放API接口及其安全性
    suoyin
    正常关闭tomcat
    学生选课系统
    chrome浏览器Network面板请求Timing分析
    页面请求速度慢,TTFB时间长的问题分析
    javascript正则表达式
    Yahoo!团队经验:网站性能优化的34条黄金法则
    angular.js中提供的基础方法
    前端构建之--gulp
  • 原文地址:https://www.cnblogs.com/pgxpython/p/10736171.html
Copyright © 2011-2022 走看看