切片最终查询集返回量:Django

时间:2015-12-26 22:34:02

标签: django django-rest-framework django-queryset django-filter

在以下函数中,我想只返回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]

有谁知道如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

如评论中所述,当Django尝试在已切片的查询集上链接任何ORM函数(filterexcludevalues ...)时,会引发此异常。

您分享的代码段似乎正确,并返回切片查询集。您需要在每次使用get_queryset的结果时检查,您只是迭代它而不是尝试将其用作QuerySet对象。

在DRF中,如果您没有覆盖子类中的get_queryset来执行额外的操作,则可以返回切片查询集AFAIK。

答案 1 :(得分:0)

使用分页代替。将页面大小设置为200项。无论您是否使用其他页面,第一页都将是您所需要的。

通过这种方式,您使用内置方法只能获得200个项目而且不会出现任何错误