如何从Django中的QuerySet获取倒数第二项?

时间:2016-12-08 12:08:57

标签: python django django-models django-queryset

如何从 Django QuerySet 中获取倒数第二项?我尝试my_queryset[-2](在检查my_queryset长度是否大于1之后),如下所示:

if len(my_queryset)>1:
     query = my_queryset[-2]

然后它返回:

  

异常值:不支持负索引。

是否有一些“Django”方式来获得这样的项目?

我唯一想到的是反转查询集并获取my_queryset[2],但我不确定它的效率。

修改

scans = self.scans.all().order_by('datetime')
if len(scans)>1:
    scan = scans[-2]

1 个答案:

答案 0 :(得分:5)

此代码产生错误

scans = self.scans.all().order_by('datetime')
if len(scans)>1:
    scan = scans[-2]

相当于

scans = self.scans.all().order_by('-datetime')
if len(scans)>1:
    scan = scans[1]

如果你想获得第二个,要使用的索引是1而不是2,因为python偏移从0开始。

另请注意django querysets are lazy,这意味着只要有合适的索引,您就可以改变主意,而不会影响性能。

  

QuerySets是懒惰的 - 创建QuerySet的行为不涉及   任何数据库活动。你可以整天堆叠过滤器,   在QuerySet之前,Django实际上不会运行查询   评估。看一下这个例子: