获取查询集中特定元素的索引

52 投票
6 回答
63860 浏览
提问于 2025-04-15 12:29

我有一个叫做 qs 的查询集,它是根据某个属性排序的,不过这个属性和我们要讨论的问题无关。然后我有一个对象,叫做 obj。现在我想知道 objqs 中的索引位置,也就是它是第几个。我的目标是尽可能高效地找到这个位置。我知道可以用 Python 的 .index() 方法,或者通过循环遍历 qs,一个个比较每个对象和 obj,但我想知道最好的方法是什么?我只关注性能,希望能找到一个高效的解决方案。

我在 Windows 上使用的是 Python 2.6.2 和 Django 1.0.2。

6 个回答

58

如果你只是想知道你的对象在所有对象中处于什么位置(比如说在排名时),你可以通过计算你之前有多少个对象来快速得出结果:

    index = MyModel.objects.filter(sortField__lt = myObject.sortField).count()
68

如果你已经在遍历查询集(queryset),并且只想知道你现在正在处理的元素的索引位置,最简单而且可能是最有效的办法是:

for index, item in enumerate(your_queryset):
    ...

不过,如果你有一个查询集和一个通过其他方式得到的对象,想要知道这个对象在查询集中的位置(如果它在的话),就不要使用这个方法。

24

Django中的QuerySets其实是生成器,而不是列表(想了解更多,可以查看Django的QuerySets文档)。
所以,想要快速找到某个元素的索引并没有捷径,我觉得直接遍历是最好的方法。

对于初学者,我建议你用最简单的方法来实现你的需求(比如遍历);如果你真的遇到性能问题,那再考虑其他方法,比如创建一个字段更少的queryset,或者其他的方式。
总之,最好把这些技巧留到最后再用,等你真的知道需要它们的时候再说。
更新:你可能想直接使用一些SQL语句来获取行号(类似于这个)。不过,Django的ORM并不原生支持这个,你需要使用原始SQL查询(可以参考文档)。我觉得这可能是最好的选择,但再次强调——只有在你真的遇到性能问题时才考虑。

撰写回答