繁体   English   中英

Django REST Framework:将过滤器应用于列表视图,但不应用于详细信息视图

[英]Django REST Framework: apply filter to list view but not detail view

使用Django REST Framework时,有没有一种方法,当使用ModelViewSet ,仅过滤列表结果而不过滤详细结果?

我有一个拥有所有者的对象列表,我只希望用户在访问对象列表时看到他们拥有的对象。 为此,我基于rest_framework.filters.BaseFilterBackend实现了一个新的过滤器后端,该过滤器在列表中可以正常使用。

当我尝试访问不属于我的用户的对象时,就会出现问题:我收到“找不到404”而不是“ 403禁止”。

换句话说,过滤似乎不仅应用于列表,而且还应用于细节视图。 有没有一种方法可以更改此设置,以便在访问未经授权查看的对象时得到预期的403?

我已经有一个权限类,可以防止用户看到他不拥有的对象,但是除非我在viewset类上注释掉filter_backends属性,否则它甚至不会被调用。

考虑这种情况的另一种方法是,我只想列出用户有权查看的对象。

您要引发的rest_framework异常是PermissionDenied以返回403 ,因此请执行此操作,而不是get_object_or_404

应用所需的逻辑,并在User不应该位于该DetailView端点处引发异常。

from rest_framework.exceptions import PermissionDenied

class UserViewSet(viewsets.ViewSet):

    model = User

    def retrieve(self, request, pk=None):
        try:
            return self.model.objects.filter(foo='bar').get(pk=pk)
        except User.DoestNotExist:
            # can't find the User based upon the filter foo='bar'
            # that represents a object permissions filter
            raise PermissionDenied("message to accompany the 403 error if desired")

您可以检查pk是否在视图kwargs中

class MyFilterBackend(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        if 'pk' not in view.kwargs:
            queryset = queryset.filter(...)
        return queryset

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM