1. 程式人生 > >13 在 Django REST framework 善用 SerializerMethodField 來優化不必要的查詢

13 在 Django REST framework 善用 SerializerMethodField 來優化不必要的查詢

style repair ask 字段 () read 希望 wait 添加

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 來優化不必要的查詢