在Django中按日期计算记录数

doz*_*oza 48 python django django-models django-queryset django-1.1

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

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

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

SELECT DATE(datetime_created), count(id) 
FROM REVIEW 
WHERE venue_id = 2
GROUP BY DATE(datetime_created);
Run Code Online (Sandbox Code Playgroud)

在Django中实现这一目标的最佳方法是什么?我可以用

Review.objects.filter(venue__pk=2)
Run Code Online (Sandbox Code Playgroud)

并在视图中解析结果,但这对我来说似乎不对.

ara*_*818 88

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

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

  • 这就像我的答案,但更好! (2认同)
  • 是的,这是[values()子句]的某种神秘行为的结果(https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values).**但是请记住,在查询集中使用oreding aplied(通过查询集的_order_by()_部分或模型上的默认排序中使用的字段)**将不起作用你**明确地**清楚**查询中的任何排序-https://docs.djangoproject.com/en/dev/topics/db/aggregation/#interaction-with-default-ordering-or-order-by (2认同)

avi*_*kam 15

仅仅为了完整性,因为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")
Run Code Online (Sandbox Code Playgroud)

它在django 1.8中适用于我,包括sqlite和MySql数据库.


Ant*_*lin 12

现在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")
Run Code Online (Sandbox Code Playgroud)


Zac*_*ach 11

如果您要存储日期字段,可以使用以下命令:

from django.db.models import Count

Review.objects.filter(venue__pk = 2)
    .values('date').annotate(event_count = Count('id'))
Run Code Online (Sandbox Code Playgroud)

因为你正在存储日期时间,所以它有点复杂,但这应该是一个很好的起点.在这里查看聚合文档.