2017-01-10 47 views
1

TLDR:我想序列化一個組及其權限名稱。但是發生了許多來自權限模型的content_type的重複查詢。我試圖通過預取來解決它,但沒有奏效。我究竟做錯了什麼?顯示組權限導致django中的重複查詢

所以我對retreive方法串行如下

class RetrieveGroupSerializer(serializers.ModelSerializer): 
    user_set = UserSerializer(many=True, read_only=True) 
    permissions = PermissionsSerializer(many=True, read_only=True) 

    class Meta: 
     model = Group 
     fields = ('name', 'user_set', 'permissions') 

給出的列表方法的串行下面

class GroupSerializer(serializers.ModelSerializer): 
    user_set = UserSerializer(many=True) 
    permissions = PermissionsSerializer(many=True) 

    class Meta: 
     model = Group 
     fields = ('url', 'user_set', 'permissions') 

的意見給出以下

class GroupViewSet(
        mixins.CreateModelMixin, 
        mixins.RetrieveModelMixin, 
        mixins.UpdateModelMixin, 
        mixins.ListModelMixin, 
        viewsets.GenericViewSet): 
    """ 
    Creates, Updates, and retrives User Groups 
    """ 

    queryset = Group.objects.all().prefetch_related('user_set').prefetch_related('permissions__content_type') 
    serializer_class = GroupSerializer 
    permission_classes = (
     IsAuthenticated, 
    ) 
    action_serializer_classes = { 
     "create": CreateGroupSerializer, 
     "retrieve": RetrieveGroupSerializer, 
     "update": UpdateGroupSerializer 
    } 

    def get_serializer_class(self): 
     try: 
      return self.action_serializer_classes[self.action] 
     except (KeyError, AttributeError): 
      return super(GroupViewSet, self).get_serializer_class() 

當我使用給出列表方法我沒有面對任何重複的查詢,但是當我在任何si上使用檢索方法時小組實例我收到很多重複查詢。 django-debug-toolbar output

正如您所看到的,來自Permission Model的content_type會被查詢62次。 因此,我在權限模型中的外鍵上使用了prefetch_related。但結果是一樣的。

但是相同的查詢集適用於List方法,並且不會導致重複查詢。你可以看到下面的 enter image description here

除了重複查詢的問題我也困惑如何可以相同的查詢集導致這樣的不同結果?

回答

2

這很可能是因爲可瀏覽的API還會顯示一個創建/更新表單,該表單與內容類型具有下拉列表,並且不會使用預取優化。 嘗試將其作爲JSON獲取並查看它執行的請求數或刪除更新的權限以查看它是否更改查詢數量。

+0

謝謝。當使用JSON時,問題不存在。 – StarLord

+0

我對那些複製品感到瘋狂,謝謝你的回答。 – Alberick0

+0

很高興這有幫助。不幸的是,這並不明顯,創建/更新表單還需要一些數據庫查詢來顯示自己。 – Linovia