【问题标题】:Slice final queryset return amount: Django切片最终查询集返回量:Django
【发布时间】:2016-04-01 06:17:06
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 你在这个查询集的某个地方还有另一个过滤器吗?
  • @doniyor 不。我对初始查询集进行了 select_relatedprefetch_related 调用,仅此而已。
  • 可能会向我们展示整个列表视图将有助于调试
  • @doniyor 我刚刚编辑了帖子以显示整个功能
  • 你能发布那个错误的回溯吗?

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


【解决方案1】:

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

这样您使用内置方法仅获取 200 个项目,您不会收到任何错误

【讨论】:

    【解决方案2】:

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

    您共享的 sn-p 似乎是正确的,并且确实返回了切片查询集。您需要检查每次使用get_queryset 的结果时,您只是在对其进行迭代,而不是尝试将其用作QuerySet 对象。

    在 DRF 中,如果您没有在子类中覆盖 get_queryset 以对其进行额外处理,则可以返回切片查询集 AFAIK。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多