Django ORM 查询集按月、周、TruncMonth 分组

Ale*_*ndr 1 python django orm

如何查询group byDjango ORM 中的日期时间字段?

楷模:

class test1(models.Model):
    id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
    name = models.CharField(verbose_name='name', max_length=200)
    cdate = models.DateField(verbose_name='date', default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

查询集数据

for i in test1.objects.all(): 
    print i.id, i.name, i.cdate

2 a 2017-08-11
3 b 2017-08-11
4 c 2017-08-11
5 a 2017-08-11
6 a 2017-08-11
Run Code Online (Sandbox Code Playgroud)

需要按月分组并使用 Django orm 计算 ID。

查询集

data = test1.objects.annotate(month=TruncMonth('cdate')).values('month').annotate(c=Count('id'))
for i in data:
    print i
Run Code Online (Sandbox Code Playgroud)

结果

{'c': 1, 'month': datetime.date(2017, 8, 1)}
{'c': 1, 'month': datetime.date(2017, 8, 1)}
{'c': 1, 'month': datetime.date(2017, 8, 1)}
{'c': 1, 'month': datetime.date(2017, 8, 1)}
{'c': 1, 'month': datetime.date(2017, 8, 1)}
Run Code Online (Sandbox Code Playgroud)

为什么不?

{'c': 5, 'month': datetime.date(2017, 8, 1)}
Run Code Online (Sandbox Code Playgroud)

Dim*_*osh 6

您是否为您的模型设置了默认排序?如果是,则将订单字段添加到分组依据可能会出现问题。它记录在这里。您可以尝试从查询中删除排序。

data = test1.objects.annotate(month=TruncMonth('cdate')).values('month').annotate(c=Count('id')).order_by()
Run Code Online (Sandbox Code Playgroud)