2010-06-15 32 views
5

Tengo una aplicación Django que procesa los resultados de las pruebas, y estoy tratando de encontrar la puntuación mediana para una determinada evaluación. Creo que esto funcionaría:Django QuerySet filter + order_by + limit

e = Exam.objects.all() 
total = e.count() 
median = int(round(total/2)) 
median_exam = Exam.objects.filter(assessment=assessment.id).order_by('score')[median:1] 
median_score = median_exam.score 

Pero siempre devuelve una lista vacía. Puedo conseguir el resultado que quiero con esto:

e = Exam.objects.all() 
total = e.count() 
median = int(round(total/2)) 
exams = Exam.objects.filter(assessment=assessment.id).order_by('score') 
median_score = median_exam[median].score 

acabo preferiría no tener que consultar todo el conjunto de exámenes. Pensé en sólo escribir una consulta prima MySQL que se ve algo como:

SELECT score FROM assess_exam WHERE assessment_id = 5 ORDER BY score LIMIT 690,1 

Pero si es posible, me gustaría permanecer dentro de ORM de Django. En general, me molesta que parezca que no puedo usar order_by con un filtro y un límite. ¿Algunas ideas?

Respuesta

5

Su sintaxis de división es incorrecta. El valor después de dos puntos no es el recuento de los elementos para obtener, sino el índice del final del segmento. Usar la 'mediana' por sí solo sin dos puntos, como lo hace en su segundo ejemplo, funcionaría.

+0

Gracias, estaba obteniendo la sintaxis de slice mezclada con la sintaxis de límite de MySQL – bjudson

Cuestiones relacionadas