按日期统计Djang中的记录数

2024-05-19 00:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

分析视图中的结果,但我觉得这样做不对。


Tags: 模型idtruedbdatetimedateindexmodel
3条回答

这应该可以(使用与您使用的MySQL特定函数相同的函数):

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

为了完整起见,由于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数据库。

既然Extra()正在贬值,一个更合适的答案将使用Trunc,例如this accepted answer

现在操作人员的问题将被回答如下

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")

相关问题 更多 >

    热门问题