django 查询集运行时 - 在恒定时间内获取第 n 个条目

Pet*_*ter 2 python django big-o runtime django-queryset

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

qs = MyModel.objects.order_by('-time')
qs = qs.filter(blah = blah)
Run Code Online (Sandbox Code Playgroud)

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

entry = list(qs[:1])
first_entry = entry[0]
Run Code Online (Sandbox Code Playgroud)

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

entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1] 
Run Code Online (Sandbox Code Playgroud)

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

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

MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0] 
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*per 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

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