Django QuerySet 过滤 + 排序 + 限制

5 投票
1 回答
13141 浏览
提问于 2025-04-16 00:00

我有一个用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',不加冒号,那是可以的。

撰写回答