相关疑难解决方法(0)

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

我有一个表,其中一列为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 …
Run Code Online (Sandbox Code Playgroud)

django postgresql django-orm django-queryset django-1.8

7
推荐指数
1
解决办法
1422
查看次数

当没有关系时进行计数并返回零的注释

给定以下关系:

class LicenseRequest:
    license_type = models.ForeignKey(LicenseType)
    created_at = models.DateField(default=now, editable=False)

class LicenseType:
    name = models.CharField(max_length=100)
    value = models.CharField(max_length=3, unique=True)
Run Code Online (Sandbox Code Playgroud)

我想计算为每种许可证类型创建了多少个请求。但是,由于我正在生成图形,因此对于在该特定时间段内没有任何许可证请求的许可证类型,我必须包含 0(零)。

我尝试按照此处的建议进行操作,但没有成功。我只能从具有多个许可证请求的许可证类型中获取计数。

qs = LicenseType.objects.filter(
                Q(licenserequest__created_at__range=(start_date, end_date)) | Q(licenserequest__isnull=True)
            ).annotate(rel_count=Count('licenserequest__id'))
Run Code Online (Sandbox Code Playgroud)

我可以找到另一种方法来实现这个目标,但我想知道是否可以通过注释来做到这一点。

我正在使用

django django-queryset

4
推荐指数
1
解决办法
4723
查看次数