django ORM查询集按月份,星期,TruncMonth

问题描述:

如何group by queryset on Django ORM中的datetime字段?django ORM查询集按月份,星期,TruncMonth

型号:

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) 

查询集数据

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 

需要按月和计数Django的ORM的ID。

查询集

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

结果

{'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)} 

为什么不呢?

{'c': 5, 'month': datetime.date(2017, 8, 1)} 

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

data = test1.objects.annotate(month=TruncMonth('cdate')).values('month').annotate(c=Count('id')).order_by() 
+0

谢谢我的朋友,你的榜样的作品,你是从俄罗斯? – Alexandr

+0

我来自白俄罗斯 –

+0

如果它帮助你,你能接受并upvote我的答案? –

您尝试计独特价值id 尝试更换

.annotate(c=Count('id')) 

.annotate(c=Count('month')) 
#     ^^^^^