【发布时间】:2015-10-19 09:19:27
【问题描述】:
我有一张表,其中一列是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查询:
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 查询。
如果有人可以提供一个示例 ORM 查询,有/没有使用 PostgreSQL 作为数据库后端的通用表表达式的解决方法。
原因很简单,引用here:
我的偏好是在数据库中进行尽可能多的数据处理,而不是真正涉及的演示内容。我不羡慕在应用程序代码中这样做,只要它是一次访问数据库即可
根据this answer django 本身不支持 CTE,但答案似乎已经过时了。
参考资料:
谢谢
【问题讨论】:
-
CTE 绝对是必经之路。从 Django 2.0 开始,我们确实对它们提出了功能请求:code.djangoproject.com/ticket/28919
标签: django postgresql django-queryset django-orm django-1.8