Django + PostgreSQL:在一个范围内填充缺失的日期

Ank*_*pli 7 django postgresql django-orm django-queryset django-1.8

我有一个表,其中一列为date. 每个日期可以有多个条目。

date         .....
-----------  -----
2015-07-20     ..
2015-07-20     ..
2015-07-23     ..
2015-07-24     ..
Run Code Online (Sandbox Code Playgroud)

我想使用 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
Run Code Online (Sandbox Code Playgroud)

对应的 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;
Run Code Online (Sandbox Code Playgroud)

我无法将此原始查询转换为 Django ORM 查询。

如果有人可以为使用 PostgreSQL 作为数据库后端的公共表表达式提供带有/不带有变通方法的示例 ORM 查询,那就太好了。

这里引用简单的原因:

我的偏好是在数据库中进行尽可能多的数据处理,而不是真正涉及的演示内容。我不羡慕在应用程序代码中这样做,只要它是到数据库的一次旅行

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

参考:

谢谢

Wan*_*der 2

我不认为你可以用纯 Django ORM 来做到这一点,而且我什至不确定这是否可以用extra()巧妙地完成。Django ORM 在处理日常事务方面非常出色,但对于更复杂的 SQL 语句和需求,尤其是 DBMS 特定的实现,它还不够成熟。您可能必须进一步深入直接执行原始 SQL,或者将该要求转移到应用程序层来完成。

您始终可以使用 Python 生成缺失的日期,但如果元素的范围和数量很大,那么速度会非常慢。如果 AJAX 请求此信息用于其他用途(例如图表),那么您可以将其卸载到 Javascript。