【发布时间】:2017-05-24 13:01:49
【问题描述】:
TLDR:我想序列化一个组及其权限名称。但是发生了很多来自权限模型的 content_type 重复查询。我试图通过预取来解决它,但没有奏效。我做错了什么?
所以下面给出了我的检索方法的序列化程序
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')
list 方法的序列化器如下所示
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()
当我使用 list 方法时,我不会遇到任何重复的查询,但是当我在任何单个组实例上使用 retrieve 方法时,我会收到很多重复的查询。
如您所见,权限模型中的 content_type 被查询了 62 次。 所以我在权限模型中的外键上使用了 prefetch_related 。但结果是一样的。
但相同的查询集适用于 List 方法并且不会导致重复查询。你可以在下面看到
除了重复查询的问题,我也很困惑同一个查询集怎么会导致如此不同的结果?
【问题讨论】:
标签: django postgresql django-rest-framework