Django从日期时间开始按日期分组

Jac*_*rke 5 django datetime date django-models django-queryset

我正在尝试计算用户从 DateTime 字段注册的日期。在数据库中,它存储为“2016-10-31 20:49:38”,但我只对日期“2016-10-31”感兴趣。

原始 SQL 查询是:

select DATE(registered_at) registered_date,count(registered_at) from User 
where course='Course 1' group by registered_date;
Run Code Online (Sandbox Code Playgroud)

可以使用“额外”,但我已经读过这已被弃用,不应这样做。它的工作原理是这样的:

User.objects.all()
    .filter(course='Course 1')
    .extra(select={'registered_date': "DATE(registered_at)"})
    .values('registered_date')
    .annotate(**{'total': Count('registered_at')})
Run Code Online (Sandbox Code Playgroud)

是否可以不使用额外的东西?

我读到可以使用 TruncDate ,我认为这是正确的查询集,但它不起作用:

User.objects.all()
    .filter(course='Course 1')
    .annotate(registered_date=TruncDate('registered_at'))
    .values('registered_date')
    .annotate(**{'total': Count('registered_at')})
Run Code Online (Sandbox Code Playgroud)

我明白<QuerySet [{'total': 508346, 'registered_date': None}]>了,TruncDate 出了点问题。

如果有人比我更了解这一点,并能指出我正确的方向,那将不胜感激。

谢谢你的帮助。

tds*_*nds 5

我试图做一些非常相似的事情并且遇到了和你一样的问题。通过order_by在应用TruncDate注释后添加一个子句,我设法解决了我的问题。所以我想这也应该对你有用:

User.objects.all()
    .filter(course='Course 1')
    .annotate(registered_date=TruncDate('registered_at'))
    .order_by('registered_date')
    .values('registered_date')
    .annotate(**{'total': Count('registered_at')})
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助?!