Django查询中的GROUP BY

时间:2012-05-06 04:43:17

标签: python mysql django django-models

亲爱的StackOverFlow社区:

我在执行以下SQL查询时需要您的帮助。

select DATE(creation_date), COUNT(creation_date) from blog_article WHERE creation_date BETWEEN SYSDATE() - INTERVAL 30 DAY AND SYSDATE() GROUP BY DATE(creation_date) AND author="scott_tiger";

这是我的Django模型

class Article(models.Model):
    title = models.CharField(...)
    author = models.CharField(...)
    creation_date = models.DateField(...)

如何使用aggregate()和annotate()函数形成上述Django查询。我创造了这样的东西 -

now = datetime.datetime.now()
date_diff = datetime.datetime.now() + datetime.timedelta(-30)
records = Article.objects.values('creation_date', Count('creation_date')).aggregate(Count('creation_date')).filter(author='scott_tiger', created_at__gt=date_diff, created_at__lte=now)

当我运行此查询时,它会给我以下错误 -

'Count' object has no attribute 'split'

知道该使用它吗?

2 个答案:

答案 0 :(得分:0)

从值中删除Count('creation_date')并在过滤后添加注释(Count('creation_date'))。

答案 1 :(得分:0)

尝试

records = Article.objects.filter(author='scott_tiger', created_at__gt=date_diff, 
    created_at__lte=now).values('creation_date').aggregate(
    ccd=Count('creation_date')).values('creation_date', 'ccd')

您需要在creation_date__count之后使用ccd或自定义名称(此处为aggregate())来引用计数结果列。
此外,values()限制aggregate列之前的group by和最后value()列声明列为select。无需按COUNT分组,该{{1}}已基于行组。