簡體   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