在下面的函数中,无论是否应用过滤器,我都只想返回200个对象。
每当我尝试这样做时,我都会错误地说:Cannot filter a query once a slice has been taken.
def get_queryset(self):
queryset = Book.objects
.select_related('user', 'category')
.prefetch_related('likers')
.all()
tag = self.request.query_params.get('tag', None)
if tag is not None:
queryset = queryset.filter(
Q(description__iexact='#{}'.format(tag)))
return queryset[:200]
有人知道怎么解决这个问题吗?
谢谢!
请改用分页。将页面大小设置为200个项目。无论你是否不使用其他页面,第一页都将是你所需要的。
这样,您就可以使用内置方法只获取200个项目,并且不会出现任何错误
正如注释中所说,当Django试图在已切片的查询集上链接任何ORM函数(filter
、exclude
、values
…)时,会引发此异常。
您共享的代码段似乎是正确的,并且确实返回了一个切片查询集。您需要检查每次使用get_queryset
的结果时,是否只是对其进行迭代,而不是尝试将其用作QuerySet
对象。
在DRF中,如果您没有重写子类中的get_queryset
以对其执行额外操作,则可以返回切片查询集AFAIK。