计算在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")