簡體   English   中英

如何將kwarg傳遞給篩選器,無法調用錯誤對象

[英]How to Pass kwarg to Filter, Getting Error Object is not Callable

在Django的REST框架需要一個傳遞kwargClubFilter從我的觀點中類。

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傳遞到我的過濾器?

您可以創建自定義過濾器后端

filters.py

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM