una producto potencia palabra lista ejemplo conjuntos conjunto cartesiano cardinalidad buscar python django indexing django-queryset

producto - ejemplo de conjuntos en python



Obtener el índice de un elemento en un conjunto de consulta (5)

Tengo un QuerySet, llamémoslo qs , que está ordenado por algún atributo que es irrelevante para este problema. Entonces tengo un objeto, llamémoslo obj . Ahora me gustaría saber qué índice obj tiene en qs , de la manera más eficiente posible. Sé que podría usar .index() de Python o posiblemente un loop a través de qs comparando cada objeto con obj , pero ¿cuál es la mejor manera de hacerlo? Estoy buscando un alto rendimiento y ese es mi único criterio.

Usando Python 2.6.2 con Django 1.0.2 en Windows.


Asumiendo con el propósito de ilustrar que sus modelos son estándar con una id clave principal, entonces la evaluación

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

encontrará el índice de obj en qs . Si bien el uso de la list evalúa el conjunto de preguntas, no evalúa el conjunto de preguntas original, sino un conjunto de preguntas derivadas. Esta evaluación ejecuta una consulta SQL para obtener únicamente los campos de ID, sin perder tiempo en buscar otros campos.


Compacto y probablemente el más eficiente:

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


Los QuerySets en Django son en realidad generadores, no listas (para más detalles, consulte la documentación de Django en QuerySets ).
Como tal, no hay atajos para obtener el índice de un elemento, y creo que una iteración simple es la mejor manera de hacerlo.

Para empezar, implementaría su requisito de la manera más simple posible (como iterar); Si realmente tiene problemas de rendimiento, entonces usaría un enfoque diferente, como crear un conjunto de preguntas con una cantidad menor de campos, o lo que sea.
En cualquier caso, la idea es dejar esos trucos lo más tarde posible, cuando definitivamente sabe que los necesita.
Actualización: Es posible que desee utilizar directamente alguna instrucción SQL para obtener el número de Rown (algo así. Sin embargo, el ORM de Django no admite esto de forma nativa y debe usar una consulta SQL sin formato (ver documentation ). Creo que esta podría ser la mejor opción , pero nuevamente, solo si realmente ves un problema de rendimiento real.


Puede hacer esto usando queryset.extra(…) y algunos SQL sin queryset.extra(…) como estos:

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


Si solo quiere saber dónde se encuentra el objeto entre todos los demás (por ejemplo, al determinar el rango), puede hacerlo rápidamente contando los objetos que tiene ante sí:

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