【问题标题】:get_queryset does not affect querying in django rest framework ModelViewSetget_queryset 不影响 django rest 框架 ModelViewSet 中的查询
【发布时间】:2020-12-20 01:32:05
【问题描述】:

我的 ViewSet 如下所示:

class ClientViewSet(viewsets.ModelViewSet):
    queryset = models.Client.objects.all()
    serializer_class = serializers.ClientSerializer

    def filter_queryset(self, queryset):
        return models.Client.objects.filter(**self.request.data)

    def get_queryset(self):
        return models.Client.objects.filter(owner=self.request.user)

模型如下所示:

class Client(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=100, blank=True, null=True)

    def __str__(self):
        return str(self.id)

所以,我正在尝试过滤客户端,以便只向他们呈现当前用户的客户端。但是,GET api/clients 仍然返回所有用户的所有客户端。 我做错了什么?

【问题讨论】:

  • 那是因为你没有进一步处理filter_queryset中的queryset。
  • 使用django-filter包,非常方便的工具

标签: python-3.x django postgresql django-rest-framework


【解决方案1】:

那是因为您没有进一步处理filter_queryset 中的queryset。 filter_queryset 是链中的后续步骤之一。因此,您应该进一步过滤查询集:

class ClientViewSet(viewsets.ModelViewSet):
    queryset = models.Client.objects.all()
    serializer_class = serializers.ClientSerializer

    def filter_queryset(self, queryset):
        return queryset.filter(**self.request.data)

    def get_queryset(self):
        return models.Client.objects.filter(owner=self.request.user)

不过,您可能想看看filter_backends [drf-doc]。这允许人们以更优雅的方式实现过滤器。通过使用**self.request.data,您可能包含一个安全漏洞,因为用户不仅可以查询模型,还可以查询相关的模型对象,因此例如使用二进制搜索来确定敏感字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2015-04-12
    • 2014-09-19
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多