在以下函数中,我想只返回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]
有谁知道如何解决这个问题?
谢谢!
答案 0 :(得分:0)
如评论中所述,当Django尝试在已切片的查询集上链接任何ORM函数(filter
,exclude
,values
...)时,会引发此异常。
您分享的代码段似乎正确,并返回切片查询集。您需要在每次使用get_queryset
的结果时检查,您只是迭代它而不是尝试将其用作QuerySet
对象。
在DRF中,如果您没有覆盖子类中的get_queryset
来执行额外的操作,则可以返回切片查询集AFAIK。
答案 1 :(得分:0)
使用分页代替。将页面大小设置为200项。无论您是否使用其他页面,第一页都将是您所需要的。
通过这种方式,您使用内置方法只能获得200个项目而且不会出现任何错误