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