Django: TruncDate 日期时间 retunrs always datetime

Django: TruncDate datetime retunrs always datetime

提问人:al78310 提问时间:8/9/2023 更新时间:8/9/2023 访问量:34

问:

我在 x86_64 上使用 Django 3.2.12 和 mysql 8.0.27 for Win64(MySQL 社区服务器 - GPL)并拥有此模型

class Anomalie(models.Model):
        dateajout = models.DateTimeField(auto_now_add=True, null=True)

我正在尝试每天获取所有异常,所以我正在使用它:

items = Anomalie.objects.annotate(date=TruncDate('dateajout')).values('dateajout').annotate(count=Count('id')).values('dateajout', 'count')

但是当我打印项目时,我会得到这个:

<QuerySet [{'dateajout': datetime.datetime(2023, 7, 4, 1, 58, 15, 509978, tzinfo=), 'count': 1}, {'dateajout': datetime.datetime(2023, 7, 10, 12, 56, 9, 682396, tzinfo=), 'count': 1}, {'dateajout': datetime.datetime(2023, 7, 11, 12, 23, 54, 838830, tzinfo=), 'count': 1}, {'dateajout': datetime.datetime(2023, 7, 12, 13, 5, 38, 557618, tzinfo=), 'count': 1}, {'dateajout': datetime.datetime(2023, 8, 6, 3, 57, 31, 69749, tzinfo=), 'count': 1}, {'dateajout': datetime.datetime(2023, 8, 6, 14, 15, 38, 704047, tzinfo=), 'count': 1}]>

如您所见,我总是得到“'count': 1”,即使在同一天(2023、8、6)创建了 2 个异常......我认为这是因为 TruncDate 返回日期时间而不是日期......

我在许多论坛上搜索了 https://forum.djangoproject.com/t/problem-with-count-and-truncdate/10122格式化日期以在 Django + Python 3 中注释计数,但我不知道我做错了什么......有什么想法吗?

Django datetime 注解

评论


答:

1赞 willeM_ Van Onsem 8/9/2023 #1

你不应该使用 ,那仍然是 ,你用的 ,你注释的东西:dateajoutdatetimedate

items = (
    Anomalie.objects.annotate(date=TruncDate('dateajout'))
    .values('date')
    .annotate(count=Count('id'))
    .values('date', 'count')
)

您可以将其简化为:

items = Anomalie.objects.values(date=TruncDate('dateajout')).annotate(
    count=Count('id')
).order_by('date')

评论

0赞 al78310 8/9/2023
使用您的代码,我得到“<QuerySet [{'date': None, 'count': 6}]>”
0赞 willeM_ Van Onsem 8/9/2023
@al78310:你用MySQL有没有机会?
0赞 al78310 8/9/2023
是的,我使用 mysql 8.0.27
0赞 willeM_ Van Onsem 8/9/2023
@al78310:数据库中可能未安装时区:django-antipatterns.com/troubleshooting/...
1赞 al78310 8/9/2023
是的,这是一个时区问题,对于将面临这个问题的人来说:dev.mysql.com/doc/refman/8.1/en/...,非常感谢