2

我正在使用多种方法通过不同的 django 查询集从 db 获取数据,但我想知道每个查询集的运行时间,如果可能的话还有更好的方法(也许在恒定时间内获取数据!!)

qs = MyModel.objects.order_by('-time')
qs = qs.filter(blah = blah)

为了获得第一个条目,我正在这样做:

entry = list(qs[:1])
first_entry = entry[0]

或获得第 10 个和最后一个条目:

entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1] 

但我相信这将花费 O(n) 时间,有没有办法在恒定时间内获得第 n 项?我不想使用 get() 因为我不知道条目的 id 或其他值(已排序),而只知道位置。

我也可以使用注释,但这也需要 O(n) 运行时间。

MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0] 

我知道该职位只需要在恒定时间内输入该条目吗?

4

1 回答 1

5

从文档:

使用 Python 的数组切片语法的子集将 QuerySet 限制为一定数量的结果。这相当于 SQL 的 LIMIT 和 OFFSET 子句。

通常,对 QuerySet 进行切片会返回一个新的 QuerySet——它不会评估查询。一个例外是,如果您使用 Python 切片语法的“step”参数。

要检索单个对象而不是列表(例如 SELECT foo FROM bar LIMIT 1),请使用简单索引而不是切片。

https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

关于在切片时不评估查询集的部分是重要的部分。

于 2013-05-14T23:23:33.327 回答