Django QuerySet 过滤 + 排序 + 限制
我有一个用Django做的应用程序,它用来处理测试结果。我想找出某个评估的中位数分数。我原本以为这样做就可以:
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
但如果可以的话,我还是想在Django的ORM里解决这个问题。主要是让我困扰的是,我似乎无法在使用过滤和限制的情况下使用order_by。有什么想法吗?
1 个回答
5
你的切片语法不对。冒号后面的值不是要获取的元素数量,而是切片结束的位置索引。如果你像第二个例子那样单独使用'median',不加冒号,那是可以的。