Django-Postgres:如何在DATE分组启用时区的日期时间字段

时间:2017-10-10 12:51:31

标签: django postgresql orm

我在使用prostgresql和django时遇到了这个问题:

我在某个特定时间创建了很多事件,这些事件存储在日期时间字段created中。

  • 我希望根据created字段的日期部分进行聚合。最简单的例子是:how many event are in each day of this month?
  • created字段可识别时区。因此,结果应根据用户所在的时区而变化。例如,如果您在2017-10-02的UTC时间23:30创建2个事件,如果您从UTC-1查看它们,您应该在10月3日在00:30,总数应该为第3个增加。

我正在努力寻找能够处理大量数据的问题的解决方案。所以每天做的事情和SQL语句都不是一个选择。我想要的东西可以翻译成:

SELECT count(*) from table GROUP BY date

现在我找到了问题第一部分的解决方案:

from django.db import connection
truncate_date = connection.ops.date_trunc_sql('day', 'created')
queryset = queryset.extra({'day': truncate_date})
total_list = list(queryset.values('day').annotate(amount=Count('id')).order_by('day'))

有没有办法在其中添加date_trunc_sql函数用来计算日期的时区?或者在date_trunc_sql之前的其他一些函数然后链接那个。

谢谢!

2 个答案:

答案 0 :(得分:4)

您可能正在寻找:timezone aware date_trunc function

但请记住,这可能与您的django的配置方式有冲突。 https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/

答案 1 :(得分:0)

Django 2.2+支持带有时区的TruncDate数据库功能

您现在可以执行以下操作:

import pytz

east_coast = pytz.timezone('America/New_York')
queryset.annotate(created_date=TruncDay("created", tzinfo=east_coast))
    .values("created_date")
    .order_by("created_date")
    .annotate(count=Count("created_date"))
    .order_by("-created_date")