2010-06-15 1 views
5

У меня есть приложение Django, которое обрабатывает результаты тестирования, и я пытаюсь найти средний балл для определенной оценки. Я бы подумал, что это сработает: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 

Но он всегда возвращает пустой список. Я могу получить результат, я хочу с этим:

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 

Я просто предпочел бы не иметь, чтобы запросить весь набор экзаменов. Я думал о написании просто сырой запрос MySQL, который выглядит примерно так:

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

Но если это возможно, я хотел бы остаться в ОРМ Джанго. В основном, это просто беспокоит меня, что я не могу использовать order_by с фильтром и лимитом. Есть идеи?

ответ

5

Ваш синтаксис фрагмента неправильный. Значение после двоеточия - это не количество элементов для получения, а индекс конца среза. Использование «медианного» самостоятельно без двоеточия, как и в вашем втором примере, будет работать.

+0

Спасибо, я получил синтаксис фрагмента, смешанный с синтаксисом ограничения MySQL – bjudson