查询Django TimeZone Aware设置的每小时命中



我是整个django的新人,发现自己陷入了整个时区意识。

问题

我想查询数据库以创建一个报告,例如:

Time of day | Clicks
--------------------
12 am       | 3
1 am        | 12
2 am        | 28
3 am        | 48
...

我希望根据创建事件的用户的时区而不是在系统的时区设置中显示

当前方法

给定以下模型(简化以避免混乱),并假设导入适当的库。

class Event(models.Model):
    type = models.CharField()
    created = models.DateTimeField()
    user = models.CharField()

i然后在tests.py

中创建以下内容
def test_events_per_day(self):
# creates events in two timezones
    date = datetime(2017, 1, 13, 12, 0, 0, 0, pytz.timezone('Pacific/Auckland'))
    date2 = datetime(2017, 1, 13, 12, 0, 0, 0, pytz.timezone('UTC'))
    Event.objects.create(
        type='click',
        created=date.strftime('%Y-%m-%dT%H:%M:00.%f%z'),
        user = 'user 1'
    )
    Event.objects.create(
        type='click',
        created=date2.strftime('%Y-%m-%dT%H:%M:00.%f%z'),
        user = 'user 2'
    )
    event_per_day_count = Event.objects 
        .filter(type='click') 
        .annotate(day=TruncDay('created')) 
        .values('day') 
        .annotate(events=Count('user', distinct = True)) 
        .order_by('day')

    self.assertEquals(over_time.first().get('events'), 2)
    # FAIL: AssertionError: 1 != 2
    # PASS if I use the same date for both

当我查看数据库并且时区信息已消失时,所有这些信息似乎都保存在UTC中(作为文档状态的第一行)。

我看了归一化,但我看不到如何使用它来解决它。介绍数据库中的时区信息并随着我们的使用而转换似乎很昂贵。在我的绝望中,我什至尝试设置USE_TZ = False来看看会发生什么,Django告诉我Mysql不喜欢。

如前所述,我仍然对这种工作方式有所了解,因此欢迎任何指示,评论或鼓励的话。

您应该能够通过将tzinfo参数指定为 TruncDay

来获得所需的东西

a tzinfo 子类,通常由 PYTZ 提供,可以传递以在特定时区中截断值。

so: .annotate(day=TruncDay('created', tzinfo=pytz.timezone('Pacific/Auckland')))

相关内容

  • 没有找到相关文章

最新更新