Невозможно увидеть параметр фильтра в представлениях на основе классов Django - PullRequest
0 голосов
/ 27 октября 2019

У меня есть два вида ниже:

class BookApiView(APIView):
    filter_backends = (filters.SearchFilter,)
    search_fields = ('title',)
    authentication_classes = (JSONWebTokenAuthentication, )
    permission_classes = (IsAuthenticated, IsNotBlacklistedUser)

    def get(self, request):
        books = Book.objects.filter(
            user=request.user.id, is_published=True).order_by('-title')
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(get, request):
        data = request.data
        serializer = BookSerializer(data=data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

class AllBookViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = AllBookSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('title',)

    def get_queryset(self):
        queryset = Book.objects.all()
        title = self.request.query_params.get('title', None)
        if title is not None:
            queryset = queryset.filter(
                title__contains=title, is_published=True)
        queryset = queryset.filter(is_published=True)
        return queryset

Они оба работают на одной модели. Однако с одним (AllBookViewSet) я могу видеть опцию фильтра в пользовательском интерфейсе остальной структуры django, а с другим я не могу.

Не применим ли фильтр django для представлений на основе классов. Я предполагаю, что это не должно иметь место, но тогда, где я иду не так, как надо здесь. Пожалуйста, помогите

1 Ответ

0 голосов
/ 27 октября 2019

Это потому, что сам Django не предоставляет какой-либо класс / метод фильтра, как это делает Django Rest Framework.

Как видите, тот, который вы можете использовать filter_backends, был унаследован от APIView, что обеспечилоDjango Rest Framework, а другой был унаследован от viewsets.ReadOnlyModelViewSet, предоставленного Django. Таким образом, вы не можете подать заявление filter_backends на AllBookViewSet.

Как этого добиться?

Существует 2 способа фильтрации данных напредставление:

  1. Пользовательский get_queryset метод на AllBookViewSet ( не рекомендуется ).

  2. Использование django-filter для создания бэкэнда фильтра для представлений на основе классов. Также есть способ интегрировать этот вид фильтра в представления rest_framework.

Итак, попробуйте.

...