Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django+PostgreSQL:在一个范围内填充缺少的日期_Django_Postgresql_Django Queryset_Django Orm_Django 1.8 - Fatal编程技术网

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

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。每个日期可以有多个条目

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;