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上使用檢索方法時小組實例我收到很多重複查詢。
正如您所看到的,來自Permission Model的content_type會被查詢62次。 因此,我在權限模型中的外鍵上使用了prefetch_related。但結果是一樣的。
但是相同的查詢集適用於List方法,並且不會導致重複查詢。你可以看到下面的
除了重複查詢的問題我也困惑如何可以相同的查詢集導致這樣的不同結果?
謝謝。當使用JSON時,問題不存在。 – StarLord
我對那些複製品感到瘋狂,謝謝你的回答。 – Alberick0
很高興這有幫助。不幸的是,這並不明顯,創建/更新表單還需要一些數據庫查詢來顯示自己。 – Linovia