我已经通过谷歌搜索“django group by month”阅读了这篇Django: Group by date (day, month, year)和所有相关内容
如果我尝试“最干净”的解决方案 - 使用Django 1.11,我最终得到了这个:
class Request(BaseModel):
date_creation = models.DateTimeField(default=None,
blank=True, null=True)
print([v for v in
Request.objects.annotate(month=ExtractMonth('date_creation'),
year=ExtractYear('date_creation'),)
.values('month', 'year')
.annotate(total=Count('month'))
.values('month', 'year', 'total')
])
结果不做分组!我明白了:
[{'month': 6, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 1}]
我需要得到:
[{'month': 6, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 2}]
我也试过了:
print([v for v in
Request.objects.extra({'month': 'strftime("%m", date_creation)',
'year': 'strftime("%Y", date_creation)'})
.values('month', 'year')
.annotate(total=Count('*'))
.values('month', 'year', 'total')
])
然后我得到:
[{'month': '06', 'year': '2017', 'total': 1},
{'month': '07', 'year': '2017', 'total': 1},
{'month': '07', 'year': '2017', 'total': 1}]
任何想法?
答案 0 :(得分:0)
以下是我的一个查询按小时分组的内容:
MyDateObject.objects.filter(**kwargs)\
.extra({ "hour": "date_part('hour', timestamp AT TIME ZONE '%s')" % (ctz.zone) })\
.values("hour")\
.annotate(Count("transaction", distinct=True))
我和你之间的区别在于我正在使用extra
功能。我想你将不得不做类似的事情而不是你的第一个annotate
:
Request.objects.extra({ "month": ExtractMonth('date_creation'),
"year": ExtractYear('date_creation') })
.values('month', 'year')
.annotate(total=Count('month'))
.values('month', 'year', 'total')
注意:我正在使用Django 1.9。
编辑:我看到的越多,也许是我的计数中的distinct=True
才能真正发挥作用。
答案 1 :(得分:0)
感谢PyCharm,我发现了这个问题。我真的不知道如果没有那个IDE我怎么能找到解决方案。我使用它越多,我发现它就越强大。然后我找到了解决方案:How can I remove Model Meta ordering in Django or get the original queryset from the built in Manager?
我的Request
模型的父级字段为date_creation
,class Meta:
为ordering = ['date_creation']
。
因此,如果您未在查询中添加order_by('field_xx')
,那么Django 会自动添加:order_by('date_creation')
。
因此我的查询看起来像:
SELECT
(strftime("%m", date_creation)) AS "month",
(strftime("%Y", date_creation)) AS "year",
COUNT(*) AS "total" FROM "app_request"
GROUP BY
(strftime("%m", date_creation)),
(strftime("%Y", date_creation)),
"app_request"."date_creation"
它破坏了查询。
解决方案是:
print([v for v in
Request.objects.annotate(month=ExtractMonth('date_creation'),
year=ExtractYear('date_creation'),)
.order_by()
.values('month', 'year')
.annotate(total=Count('*'))
.values('month', 'year', 'total')
])
实际上,我的解决方案从一开始就在运作!