[英]How to Pass kwarg to Filter, Getting Error Object is not Callable
在Django的REST框架需要一個傳遞kwarg
我ClubFilter
從我的觀點中類。
class ClubView(ListCreateView):
queryset = Club.objects.all()
serializer_class = ClubSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = ClubFilter
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
所以我嘗試將self.filter_class = ClubFilter(**kwargs)
到列表列表中,但出現錯誤:
“ ClubFilter”對象不可調用
如何從視圖中將kwarg傳遞到我的過濾器?
您可以創建自定義過濾器后端
class MyFilterBackend(DjangoFilterBackend):
def filter_queryset(self, request, queryset, view):
filter_class = self.get_filter_class(view, queryset)
if filter_class:
return filter_class(request.query_params, queryset=queryset, **kwargs).qs
return queryset
並改用DjangoFilterBackend
filter_class
必須是一個類,不能是類實例。 因此,在創建過濾器對象時必須傳遞該變量。
過濾器對象的創建是在過濾器后端完成的,因此您應該對過濾器后端進行子類化,並在其中提供一些可以避免浪費的方法。
我假設您正在使用DjangoFilterBackend
。 然后可以像這樣子類化它:
class MyFilterBackend(DjangoFilterBackend):
def filter_queryset(self, request, queryset, view):
filter_class = self.get_filter_class(view, queryset)o
if filter_class:
if hasattr(view, 'get_filter_kwargs'):
filter_kwargs = view.get_filter_kwargs(queryset=queryset)
else:
filter_kwargs = {'queryset': queryset}
return filter_class(request.query_params, **filter_kwargs).qs
return None
這將允許您在視圖內部創建方法get_filter_kwargs
,該方法應返回所有應傳遞到過濾器類中的get_filter_kwargs
。 請記住,還要傳遞kwarg中為該方法提供的queryset。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.