Django QuerySet 过滤器 + order_by + 限制

Posted

技术标签:

【中文标题】Django QuerySet 过滤器 + order_by + 限制【英文标题】:Django QuerySet filter + order_by + limit 【发布时间】:2011-03-04 02:48:28 【问题描述】:

所以我有一个处理测试结果的 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】:

您的切片语法错误。冒号后面的值不是要获取的元素个数,而是切片结束的索引。正如您在第二个示例中所做的那样,单独使用不带冒号的“中位数”会起作用。

【讨论】:

谢谢,我把切片语法和 MySQL 限制语法弄混了

以上是关于Django QuerySet 过滤器 + order_by + 限制的主要内容,如果未能解决你的问题,请参考以下文章

QuerySet 中的 Django _set.all() 过滤器

django QuerySet 过滤器()

在django中动态添加参数到queryset过滤器调用[重复]

Django查询集QuerySet及两大特性

django queryset过滤外键

在 Django 中,如何使用动态字段查找过滤 QuerySet?