限制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延迟的原因是因为它只接受start
和stop
值并将它们传递给另一种方法。
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] 删除。
我来说两句