按 Django 2 中的每个日期分组
Group By each date in Django 2
我有一个名为 Log
的模型,它有一个日期时间字段 created_at
。
我想做的是计算每个日期的Log
个数。
我试过这样做:
from django.db.models.functions import TruncDate
Log.objects.annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))
这给了我以下信息:
{'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 2}
也就是说,date
不是唯一的。
我想要的结果是这样的:
{'date': datetime.date(2018, 1, 17), 'count': 4}, {'date': datetime.date(2018, 1, 18), 'count': 2}
如何解决这个问题?
如果您在 Log
模型中设置默认排序,额外字段将添加到查询的 GROUP BY 部分,这可能会导致此问题。尝试删除排序。
Log.objects.order_by().annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))
在Django中可以使用distinct()方法获取唯一值
例如:
Log.objects.annotate(date=TruncDate('created_at')).values('date').distinct()
我有一个名为 Log
的模型,它有一个日期时间字段 created_at
。
我想做的是计算每个日期的Log
个数。
我试过这样做:
from django.db.models.functions import TruncDate
Log.objects.annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))
这给了我以下信息:
{'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 2}
也就是说,date
不是唯一的。
我想要的结果是这样的:
{'date': datetime.date(2018, 1, 17), 'count': 4}, {'date': datetime.date(2018, 1, 18), 'count': 2}
如何解决这个问题?
如果您在 Log
模型中设置默认排序,额外字段将添加到查询的 GROUP BY 部分,这可能会导致此问题。尝试删除排序。
Log.objects.order_by().annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))
在Django中可以使用distinct()方法获取唯一值
例如:
Log.objects.annotate(date=TruncDate('created_at')).values('date').distinct()