2010-06-15 9 views
5

J'ai donc une application Django qui traite les résultats des tests, et j'essaie de trouver le score médian pour une certaine évaluation. Je pense que cela fonctionnerait:Filtre Django QuerySet + 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 

Mais il retourne toujours une liste vide. Je peux obtenir le résultat que je veux avec ceci:

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 

Je voudrais juste préférerais ne pas avoir à interroger l'ensemble des examens. Je pensais juste écrire une requête MySQL première qui ressemble à quelque chose comme:

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

Mais si possible, je voudrais rester dans l'ORM de Django. La plupart du temps, cela me dérange que je n'arrive pas à utiliser order_by avec un filtre et une limite. Des idées?

Répondre

5

Votre syntaxe de tranche est incorrecte. La valeur après le deux-points n'est pas le nombre d'éléments à obtenir, mais l'indice de la fin de la tranche. Utiliser «médian» tout seul sans deux points, comme vous le faites dans votre deuxième exemple, fonctionnerait.

+0

Merci, j'obtenais la syntaxe de tranche mélangée avec la syntaxe limite MySQL – bjudson