【问题标题】:displaying group permissions causing duplicate queries in django在 django 中显示导致重复查询的组权限
【发布时间】: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


    【解决方案1】:

    这可能是因为可浏览 API 还显示了一个创建/更新表单,该表单包含内容类型的下拉列表,并且不会使用预取优化。 尝试以 JSON 格式获取它并查看它执行了多少请求或删除更新权限以查看它是否会更改查询数量。

    【讨论】:

    • 谢谢。仅使用 JSON 时问题不存在。
    • 我被那些重复的东西弄疯了,谢谢你的回答。
    • 很高兴这有帮助。不幸的是,创建/更新表单还需要一些数据库查询来显示自己,这一点并不明显。
    猜你喜欢
    • 2014-05-31
    • 2021-10-15
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2011-10-18
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多