计算在Django中按datelogging的logging数

我有一个类似于以下的模型:

class Review(models.Model): venue = models.ForeignKey(Venue, db_index=True) review = models.TextField() datetime_created = models.DateTimeField(default=datetime.now) 

我想查询数据库以获得按天分组的场所的评论总数。 MySQL查询将是:

 SELECT DATE(datetime_created), count(id) FROM REVIEW WHERE venue_id = 2 GROUP BY DATE(datetime_created); 

什么是在Django中完成这个最好的方法? 我可以使用

 Review.objects.filter(venue__pk=2) 

并在视图中parsing结果,但是这对我来说并不合适。

这应该工作(使用您使用相同的MySQL特定function):

 Review.objects.filter(venue__pk=2) .extra({'date_created' : "date(datetime_created)"}) .values('date_created') .annotate(created_count=Count('id')) 

如果你正在存储一个date字段,你可以使用这个:

 from django.db.models import Count Review.objects.filter(venue__pk = 2) .values('date').annotate(event_count = Count('id')) 

因为你存储date时间,这有点复杂,但这应该提供一个很好的起点。 查看这里的聚合文档。

只是为了完整性,因为extra()是为了贬低,所以可以使用这种方法:

 from django.db.models.expressions import DateTime Review.objects.all().\ annotate(month=DateTime("timestamp", "month", pytz.timezone("Etc/UTC"))).\ values("month").\ annotate(created_count=Count('id')).\ order_by("-month") 

它在django 1.8中为我工作,无论是在sqlite和MySql数据库。

你也可以定义自定义function:

 from django.db.models.expressions import Func # create custom sql function class ExtractDateFunction(Func): function = "DATE" # thats the name of function, the way it mapped to sql # pass this function to annotate Review.objects.filter(venue__pk=2) .annotate(date_created=ExtractDateFunction("datetime_created")) .values('date_created') .annotate(created_count=Count('id')) 

只要确保您的数据库引擎支持DATEfunction

现在Extra()正在被折旧,一个更合适的答案会使用Trunc,比如这个被接受的答案

现在OP的问题可以回答如下

 from django.db.models.functions import TruncDay Review.objects.all() .annotate(date=TruncDay('datetime_created') .values("date") .annotate(created_count=Count('id')) .order_by("-date")