Создание пользовательского фильтра поиска в представлении Django API - PullRequest
0 голосов
/ 25 марта 2019

У меня есть свое пользовательское представление API, и я хочу использовать поисковый фильтр в этом представлении, но универсальный фильтр не работает, поэтому я хочу создать собственный, но он не работает, и я не знаю, где проблема.

вид

class TaskIndexAPIView(APIView):
filter_backends = (CustomSearchFilter,)
search_fields = ('name', 'description', 'user__username')
def get_queryset(self):
    return Task.objects.all()

def get(self, request):
    tasks = self.get_queryset()
    for i in tasks:
        if i.date <= date.today():
            i.delayed = 'This task is delayed'
            i.save()
        else:
            i.delayed = ''
            i.save()

    serializer = IndexSerializer(tasks, many=True)
    return Response(serializer.data)

Мой фильтр пользовательского поиска

search_filter

class CustomSearchFilter(filters.SearchFilter):
def get_search_fields(self, view, request):
    if request.get_queryset.get('name', 'user'):
        return ['name', 'user']
    return super(CustomSearchFilter, self).get_search_fields(view, request)

1 Ответ

1 голос
/ 25 марта 2019

В вашем контексте разница между APIView и generic view заключается в том, что у общего представления есть метод с именем filter_queryset(), который обрабатываетоперации фильтрации и поиска.

Так что здесь, на ваш взгляд, нам нужно включить то же самое.

class TaskIndexAPIView(APIView):
    filter_backends = (CustomSearchFilter,)
    search_fields = ('name', 'description', 'user__username')

    <b>def filter_queryset(self, queryset):
        """
        Given a queryset, filter it with whichever filter backend is in use.
        You are unlikely to want to override this method, although you may need
        to call it either from a list view, or from a custom `get_object`
        method if you want to apply the configured filtering backend to the
        default queryset.
        """
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset</b>

    def get_queryset(self):
        return Task.objects.all()

    def get(self, request):
        <b>the_filtered_qs = self.filter_queryset(self.get_queryset())

        tasks = the_filtered_qs</b>
        for i in tasks:
            if i.date &lt= date.today():
                i.delayed = 'This task is delayed'
                i.save()
            else:
                i.delayed = ''
                i.save()

        serializer = IndexSerializer(tasks, many=True)
        return Response(serializer.data)

вы получите отфильтрованный набор запросов как

the_filtered_qs = self.filter_queryset(self.get_queryset())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...