切片最终查询集 return 数量:Django

Slice final queryset return amount: Django

在下面的函数中,我想 return 只有 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]

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

谢谢!

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

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

在 DRF 中,您可以 return 切片查询集 AFAIK,如果您不覆盖子 class 中的 get_queryset 以使用它做额外的事情。

改用分页。将页面大小设置为 200 个项目。不管你不使用其他页面,第一页就是你所需要的。

这样你就可以使用内置方法来获取 200 个项目并且你不会得到任何错误