Django+PostgreSQL:在一个范围内填充缺少的日期
我有一个表,其中一列是date。每个日期可以有多个条目Django+PostgreSQL:在一个范围内填充缺少的日期,django,postgresql,django-queryset,django-orm,django-1.8,Django,Postgresql,Django Queryset,Django Orm,Django 1.8,我有一个表,其中一列是date。每个日期可以有多个条目 date ..... ----------- ----- 2015-07-20 .. 2015-07-20 .. 2015-07-23 .. 2015-07-24 .. 我希望使用Django ORM和PostgreSQL作为数据库后端以以下形式获取数据: date count(date) ----------- ----------- 2015-07-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查询:
我无法将此原始查询转换为Django ORM查询
如果有人能给出一个示例ORM查询,并使用PostgreSQL作为数据库后端,提供/不提供通用表表达式的变通方法,那就太好了
原因很简单:
我的偏好是在数据库中进行尽可能多的数据处理,而不是真正涉及到的演示内容。我不羡慕在应用程序代码中这样做,只要只需一次访问数据库
根据django的说法,本机不支持CTE,但答案似乎已经过时
参考资料:
谢谢我不认为用纯Django ORM就可以做到这一点,我甚至不确定用它是否可以做到。Django ORM在处理日常事务方面非常出色,但对于更复杂的SQL语句和需求,尤其是DBMS特定的实现,它还不太成熟。您可能需要降低成本,或者减轻应用层的需求
您总是可以使用Python生成缺少的日期,但是如果元素的范围和数量很大,那么速度会非常慢。如果AJAX请求将其用于其他用途,例如图表,则可以将其卸载到Javascript。代替递归CTE,您可以使用generate_series构建日历表:
SELECT calendar, count(mt.zdate) as THE_COUNT
FROM generate_series('2015-07-20'::date
, '2015-07-24'::date
, '1 day'::interval) calendar
LEFT JOIN my_table mt ON mt.zdate = calendar
GROUP BY 1
ORDER BY 1 ASC;
顺便说一句:我把date重命名为zdate。日期对于列来说是个坏名字,对于数据类型来说是个坏名字CTE绝对是个不错的选择。从Django 2.0开始,我们确实对其提出了功能要求:
SELECT calendar, count(mt.zdate) as THE_COUNT
FROM generate_series('2015-07-20'::date
, '2015-07-24'::date
, '1 day'::interval) calendar
LEFT JOIN my_table mt ON mt.zdate = calendar
GROUP BY 1
ORDER BY 1 ASC;