gpt4 book ai didi

mysql - 将 Django Count() 与条件查找类型一起使用

转载 作者:行者123 更新时间:2023-11-29 03:03:27 30 4
gpt4 key购买 nike

所以我正在尝试汇总考试数据,并且因为数据库位于另一台服务器上,所以我正在尝试将其减少到尽可能少的数据库调用。

我有这个模型(如果重要的话,它的对应表在 mySQL 数据库中):

class Exam(models.Model):
submitted = models.BooleanField(default=False)
score = models.DecimalField(default=Decimal(0))

这个查询:

>>> exam_models.Exam.objects\
... .using("exam_datebase")\
... .aggregate(average=Avg("score"),
... total=Count("submitted"))
{'average': 22.251082, 'total': 231}

我正在寻找的是一种还可以检索通过考试次数的方法,大致如下:

>>> exam_models.Exam.objects\
... .using("exam_datebase")\
... .aggregate(average=Avg("score"),
... total=Count("submitted"))
... passed=Count("score__gte=80"))
{'average': 22.251082, 'total': 231, 'passed': 42}

我知道我可以使用 .filter(score__gte=80).count() 发送另一个查询,但我真的希望在同一聚合上同时获得总计数和通过计数.有什么想法吗?

最佳答案

您要么需要两个查询,要么手动进行聚合。

要了解原因,让我们考虑一下 Django 生成并用于查询数据库的底层 SQL。

Exam.objects.aggregate(average=Avg("score"), total=Count("submitted"))  

大致翻译成

SELECT AVG(score), COUNT(submitted)
FROM exam

聚合的“计数”部分应用于基础 sql 查询中的 SELECT 子句。但是如果我们只想包含大于某个值的分数,则 SQL 查询需要看起来像这样:

SELECT AVG(score), COUNT(submitted)
FROM exam
WHERE score > 80

过滤具有特定“分数”的考试适用于基础 SQL 语句的 WHERE 或 HAVING 子句。

不幸的是,并没有办法将这两者结合起来。所以,你被困在做两个查询。

说了这么多,如果你真的想做一个查询,一个选择是在你的 python 代码中做聚合:

exams = Exam.objects.all()
total_score = 0
total_submitted = 0
passed = 0
for exam in exams:
total_score += exam.score
if exam.submitted:
total_submitted += 1
if exam.score >= 80:
passed += 1
exam_aggregates = {
'average': total_score / len(exams),
'submitted': total_submitted,
'passed': passed,
}

关于mysql - 将 Django Count() 与条件查找类型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554385/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com