[英]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.