我有一个QuerySet,姑且称之为qs
,这是由一些属性,是无关紧要这个问题订购。 然后,我有一个对象,让我们称之为obj
。 现在,我想知道在什么指数obj
有qs
,尽可能高效地。 我知道,我可以使用.index()
通过从Python或可能环qs
每个对象比较obj
,但什么是去这样做的最佳方式? 我正在寻找高性能,这就是我的唯一标准。
使用Python 2.6.2在Windows上的Django 1.0.2。
我有一个QuerySet,姑且称之为qs
,这是由一些属性,是无关紧要这个问题订购。 然后,我有一个对象,让我们称之为obj
。 现在,我想知道在什么指数obj
有qs
,尽可能高效地。 我知道,我可以使用.index()
通过从Python或可能环qs
每个对象比较obj
,但什么是去这样做的最佳方式? 我正在寻找高性能,这就是我的唯一标准。
使用Python 2.6.2在Windows上的Django 1.0.2。
在Django的查询集实际上是发电机,没有列表(详情见上查询集Django文档 )。
因此,没有捷径得到一个元素的索引,我觉得一个普通的迭代是做到这一点的最好办法。
对于首发,我将实现以最简单的方式您的要求可能(如迭代); 如果你真的有性能问题,那么我会用一些不同的方法,比如建立一个查询集与领域,或者其他更小的量。
在任何情况下,这个想法是留下这样的招数越晚越好,当你肯定知道你需要他们。
更新:您可能需要直接使用一些SQL语句来获取ROWNUMBER(东西谎言然而,Django的ORM本身并不支持这一点,你必须使用一个原始的SQL查询(见文档 )。我认为这可能是最好的选择,但再次 - 只有当你真正看到一个真正的性能问题。
结构紧凑,可能是最有效的:
for index, item in enumerate(your_queryset):
...
如果你只是想知道你在哪里坐对象在所有其他(如确定等级时),您可以快速通过您之前计算的对象做到这一点:
index = MyModel.objects.filter(sortField__lt = myObject.sortField).count()
假设用于说明的目的,你的模型是用一个主键的标准id
,然后评估
list(qs.values_list('id', flat=True)).index(obj.id)
将发现的指数obj
的qs
。 虽然使用的list
评估查询集,它的计算结果不是原来的查询集,但派生的查询集。 该评估运行SQL查询来获取ID字段只,而不是浪费时间获取等领域。
为此,您可以使用queryset.extra(…)
和一些原始的SQL就像这样:
queryset = queryset.order_by("id")
record500 = queryset[500]
numbered_qs = queryset.extra(select={
'queryset_row_number': 'ROW_NUMBER() OVER (ORDER BY "id")'
})
from django.db import connection
cursor = connection.cursor()
cursor.execute(
"WITH OrderedQueryset AS (" + str(numbered_qs.query) + ") "
"SELECT queryset_row_number FROM OrderedQueryset WHERE id = %s",
[record500.id]
)
index = cursor.fetchall()[0][0]
index == 501 # because row_number() is 1 indexed not 0 indexed
这是可能的一个简单的Python的方式来查询一个查询集的元素的索引:
(*qs,).index(instance)
这个答案将解开查询集到一个列表,然后使用内置的Python指数函数来确定它的位置。