SearchFilter не работает, когда данных много

Я тестировал SearchFilter, когда у меня было около 10 записей, и он работал нормально, но я пошел дальше и протестировал его, когда количество записей данных превысило 200, он просто возвращает те же данные без поиска или фильтрации данных, ниже приведен мой файл View :

class PostList(generics.ListCreateAPIView):
    """Blog post lists"""
    queryset = Post.objects.filter(status=APPROVED)
    serializer_class = serializers.PostSerializer
    authentication_classes = (JWTAuthentication,)
    permission_classes = (PostsProtectOrReadOnly, IsMentorOnly)
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filter_fields = ('title', 'body', 'description',)
    search_fields = (
        '@title',
        '@body',
        '@description',
    )


    def filter_queryset(self, queryset):
        ordering = self.request.GET.get("order_by", None)
        author = self.request.GET.get("author", None)
        if ordering == 'blog_views':
            queryset = queryset.annotate(
                address_views_count=Count('address_views')).order_by(
                '-address_views_count')

        if author:
            queryset = queryset.filter(owner__email=author)

        return queryset

Вот как я ищу :

/api/v1/blogs/?search=an+elephant

Но он просто возвращает все данные вместо фильтрации.

Поскольку вы сделали переопределение filter_queryset, он больше не будет работать с filter_backends для фильтрации данных. Вы должны фильтровать набор запросов дальше, сделав супервызов:

class PostList(generics.ListCreateAPIView):
    # …
    
    def filter_queryset(self, queryset):
        ordering = self.request.GET.get('order_by', None)
        author = self.request.GET.get('author', None)
        # filter queryset with filter_backends 🖟
        queryset = super().filter_queryset(queryset)
        if ordering == 'blog_views':
            queryset = queryset.annotate(
                address_views_count=Count('address_views')
            ).order_by('-address_views_count')
        
        if author:
            queryset = queryset.filter(owner__email=author)
        
        return queryset
Вернуться на верх