当数据很多时,SearchFilter 行为不当
SearchFilter misbehaves when data is a lot
我在有大约 10 条记录时测试了 SearchFilter,它工作正常,但是当数据记录超过 200 条时我继续测试它,它只是返回相同的数据而不搜索或过滤数据,下面是我的视图文件:
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
但它只是 returns 返回所有数据而不是过滤。
因为您覆盖了 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 = <strong>super().filter_queryset(queryset)</strong>
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
我在有大约 10 条记录时测试了 SearchFilter,它工作正常,但是当数据记录超过 200 条时我继续测试它,它只是返回相同的数据而不搜索或过滤数据,下面是我的视图文件:
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
但它只是 returns 返回所有数据而不是过滤。
因为您覆盖了 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 = <strong>super().filter_queryset(queryset)</strong>
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