在不使用切片的情况下,限制了Django QuerySet的结果数量

用户名

限制Django查询集返回的结果集的方法是通过数组切片完成的。例如,要获得前五个人:

People.objects.all()[0:5]

或者,按名称排序:

People.objects.order_by(name)[0:5]

或按名称排序,但仅限65岁以上的人:

People.objects.order_by(name).filter(age__gt=65)[0:5]

实际上,我可以想到的对没有功能的查询集唯一活动是限制。

我想知道的是,有没有一种方法(内部,有文档或其他方法)可以在QuerySet充当限制或限制的上调用如果没有,执行此操作的最佳方法是什么?


笔记:

  • 是的,这可能是个坏主意,不,我不是很热衷于实现它,但是如果有充分的理由要完成它,可以吗?
  • 是的,我知道切片是延迟执行的,这不是我要的。
  • 这不是此问题的重复,因为公认的答案是:

    不要results[:max_count]在视图中,后.order_by()

用户名

查看Django Querysets的代码,它看起来不像黑盒子

def __getitem__(self, k):
    """
    Retrieves an item or slice from the set of results.
    """

    # ... trimmed ...

    if isinstance(k, slice):
        qs = self._clone()
        if k.start is not None:
            start = int(k.start)
        else:
            start = None
        if k.stop is not None:
            stop = int(k.stop)
        else:
            stop = None
        qs.query.set_limits(start, stop)
        return list(qs)[::k.step] if k.step else qs

    qs = self._clone()
    qs.query.set_limits(k, k + 1)
    return list(qs)[0]

关键行在这里:

qs.query.set_limits(start, stop)

slice延迟的原因是因为它只接受startstop值并将它们传递给另一种方法。

对应于此处对sql.Query对象的调用:

def set_limits(self, low=None, high=None):

因此有可能(尽管可能不建议这样做)像这样对Queryset进行切片:

people = People.objects.order_by(name).filter(age__gt=65) # unevaluated
people.query.set_limits(start, stop)  # still unevaluated
for person in people:  # now its evaluated
    person.do_the_thing()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django:精确查找的 QuerySet 值必须使用切片限制为一个结果

ValueError对于精确查找的QuerySet值必须限制为使用Django视图切片的一个结果

Django objects.get():用于精确查找的QuerySet值必须使用切片限制为一个结果

Django 信号:精确查找的 QuerySet 值必须使用切片限制为一个结果

Django错误:必须使用切片将精确查找的QuerySet值限制为一个结果?

django错误,“用于精确查找的QuerySet值必须限制为使用切片的一个结果”

django-在结果受限制的queryset上切片/过滤后过滤

精确查找的QuerySet值必须使用切片限制为一个结果

错误:精确查找的 QuerySet 值必须使用切片限制为一个结果

Django QuerySet切片返回意外结果

如何解决“用于精确查找的QuerySet值必须限制为使用切片的一个结果。” Django中的错误

需要帮助解决错误“精确查找的 QuerySet 值必须限制为使用切片的一个结果”

必须使用切片将精确查找的QuerySet值限制为一个结果。过滤错误

如何在Django表单的queryset上使用切片?

切片后订购Django QuerySet

Django Queryset结果的顺序

如何获得解决此错误的信息“精确查找的QuerySet值必须限制为使用切片的一个结果。”

如何让用户关联到另一个模型 DRF。ValueError:精确查找的 QuerySet 值必须使用切片限制为一个结果

我如何解决精确查找的 QuerySet 值必须限制为使用切片的一个结果。姜戈

限制解析结果的数量

在不使用分组依据的情况下获得独特的结果

在不使用 hashlib 的情况下 Hexify sha 摘要结果

在不使用DISTINCT子句的情况下获得独特的结果

在不使用结构的情况下将JSON转换为地图切片并将地图切片转换为Go

如何在不使用互斥锁的情况下从多个线程以任意索引写入可变切片?

如何在不使用脚本剥离模拟器切片的情况下创建动态框架

如何在不使用索引和切片的情况下访问嵌套列表中的值?

在Django Unite中,动态数量的QuerySet

如何限制查找结果的数量?