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的一個字段。spa

例:多對多.net

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/86475587code

相關文章
相關標籤/搜索