首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django ORM:仅在数据库中计算-查询可能吗?

Django ORM:仅在数据库中计算-查询可能吗?
EN

Stack Overflow用户
提问于 2022-06-21 13:27:17
回答 1查看 24关注 0票数 0

我有相当简单的数据集,它包含以下数据:

代码语言:javascript
运行
复制
id    |    aqi    |    date          |    state_name
1     |    17     |    2020-01-01    |    California
2     |    54     |    2020-01-02    |    California
3     |    37     |    2020-01-03    |    California
4     |    29     |    2020-01-04    |    California

我试图实现的是从2022年4月开始的平均空气质量指数减去2021年4月的平均空气质量指数,而不需要多次查询。这是否可能,还是应该使用两个查询并手动进行比较?根据我的理解,我应该使用q-表达式来过滤正确的日期,对吗?

代码语言:javascript
运行
复制
AirQuality.objects.filter(Q(date__range=['2021-04-01', '2021-04-30']) & Q('2022-04-01', '2022-04-30'))

到目前为止,我遇到的最好的解决方案是:

代码语言:javascript
运行
复制
qs_apr20 = (
    AirQuality.objects
    .aggregate(apr20=Avg('aqi', filter=Q(date__range=(datetime.date(2020, 4, 1), datetime.date(2020, 4, 30)))))['apr20']
)

qs_apr21 = (
    AirQuality.objects
    .aggregate(apr21=Avg('aqi', filter=Q(date__range=(datetime.date(2021, 4, 1), datetime.date(2021, 4, 30)))))['apr21']
)

result = round(qs_apr21 - qs_apr20, 2)

谢谢你的帮助,祝你今天愉快!

EN

回答 1

Stack Overflow用户

发布于 2022-06-21 16:59:30

文档中得到启发,以下几点应该有效:

代码语言:javascript
运行
复制
>>> import datetime
>>> from django.db.models import Q, Avg
>>> from django.db.models import F
>>> apr21 = Avg('aqi', filter=Q(date__range=(datetime.date(2021, 4, 1), datetime.date(2021, 4, 30)))
>>> apr22 = Avg('aqi', filter=Q(date__range=(datetime.date(2022, 4, 1), datetime.date(2022, 4, 30)))
>>> aqi_calc = Airquality.objects.annotate(apr21=apr21)
                         .annotate(apr22=apr22)
                         .annotate(diff=F('apr22') - F('apr21'))

如果我没有弄错的话,它应该在1查询中完成所有的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72701634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档