加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django PostgreSQL:填写范围内的缺失日期

发布时间:2020-12-20 13:06:20 所属栏目:Python 来源:网络整理
导读:我有一个表,其中一列是日期.每个日期可以有多个条目. date .....----------- -----2015-07-20 ..2015-07-20 ..2015-07-23 ..2015-07-24 .. 我想使用Django ORM和PostgreSQL作为数据库后端,以下面的形式获取数据: date count(date)----------- -----------20
我有一个表,其中一列是日期.每个日期可以有多个条目.

date         .....
-----------  -----
2015-07-20     ..
2015-07-20     ..
2015-07-23     ..
2015-07-24     ..

我想使用Django ORM和PostgreSQL作为数据库后端,以下面的形式获取数据:

date         count(date)
-----------  -----------
2015-07-20        2
2015-07-21        0       (missing after aggregation)
2015-07-22        0       (missing after aggregation)
2015-07-23        1
2015-07-24        1

对应的PostgreSQL查询:

WITH RECURSIVE date_view(start_date,end_date) 
AS ( VALUES ('2015-07-20'::date,'2015-07-24'::date) 
     UNION ALL SELECT start_date::date + 1,end_date 
     FROM date_view 
     WHERE start_date < end_date ) 
SELECT start_date,count(date) 
FROM date_view LEFT JOIN my_table ON date=start_date 
GROUP BY date,start_date 
ORDER BY start_date ASC;

我将此原始查询转换为Django ORM查询时遇到问题.

如果有人可以使用PostgreSQL作为数据库后端,使用/不使用公用表表达式的解决方法来提供样本ORM查询,那将是很棒的.

引用here的简单原因是:

My preference is to do as much data processing in the database,short of really involved presentation stuff. I don’t envy doing this in application code,just as long as it’s one trip to the database

根据this answer,django本身不支持CTE,但答案似乎已经过时了.

参考文献:

> MySQL: Select All Dates In a Range Even If No Records Present
> WITH Queries (Common Table Expressions)

谢谢

解决方法

我不认为你可以用纯Django ORM做到这一点,我甚至不确定这是否可以用 extra()完成.Django ORM在处理通常的东西方面非常好,但对于更复杂的SQL语句和要求,更多因此,对于DBMS特定的实现,它还没有完全实现.您可能必须降低到 executing raw SQL directly,或者卸载应用程序层要执行的要求.

您总是可以使用Python生成缺少的日期,但如果元素的范围和数量很大,那将会非常慢.如果这是AJAX请求其他用途(例如图表),那么您可以将其卸载到Javascript.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读