获取一个元素的索引的查询集(Get the index of an element in a que

2019-06-24 03:06发布

我有一个QuerySet,姑且称之为qs ,这是由一些属性,是无关紧要这个问题订购。 然后,我有一个对象,让我们称之为obj 。 现在,我想知道在什么指数objqs ,尽可能高效地。 我知道,我可以使用.index()通过从Python或可能环qs每个对象比较obj ,但什么是去这样做的最佳方式? 我正在寻找高性能,这就是我的唯一标准。

使用Python 2.6.2在Windows上的Django 1.0.2。

Answer 1:

在Django的查询集实际上是发电机,没有列表(详情见上查询集Django文档 )。
因此,没有捷径得到一个元素的索引,我觉得一个普通的迭代是做到这一点的最好办法。

对于首发,我将实现以最简单的方式您的要求可能(如迭代); 如果你真的有性能问题,那么我会用一些不同的方法,比如建立一个查询集与领域,或者其他更小的量。
在任何情况下,这个想法是留下这样的招数越晚越好,当你肯定知道你需要他们。
更新:您可能需要直接使用一些SQL语句来获取ROWNUMBER(东西谎言然而,Django的ORM本身并不支持这一点,你必须使用一个原始的SQL查询(见文档 )。我认为这可能是最好的选择,但再次 - 只有当你真正看到一个真正的性能问题。



Answer 2:

结构紧凑,可能是最有效的:

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


Answer 3:

如果你只是想知道你在哪里坐对象在所有其他(如确定等级时),您可以快速通过您之前计算的对象做到这一点:

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


Answer 4:

假设用于说明的目的,你的模型是用一个主键的标准id ,然后评估

list(qs.values_list('id', flat=True)).index(obj.id)

将发现的指数objqs 。 虽然使用的list评估查询集,它的计算结果不是原来的查询集,但派生的查询集。 该评估运行SQL查询来获取ID字段只,而不是浪费时间获取等领域。



Answer 5:

为此,您可以使用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


Answer 6:

这是可能的一个简单的Python的方式来查询一个查询集的元素的索引:

(*qs,).index(instance)

这个答案将解开查询集到一个列表,然后使用内置的Python指数函数来确定它的位置。



文章来源: Get the index of an element in a queryset