在Django时区感知设置上查询每小时的点击次数

时间:2017-11-22 00:04:07

标签: python mysql django datetime timezone

我是整个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()

然后我在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(as the first line of the documentation states)保存。

我查看了规范化,但我无法完全了解如何使用它进行修复。在数据库中记录时区信息并进行转换似乎很昂贵。在我的绝望中,我甚至尝试设置USE_TZ = False来看看会发生什么,Django告诉我MySQL不喜欢这样。

如前所述,我仍然对这是如何运作有所了解,所以任何指针,评论或鼓励的话都会受到欢迎。

1 个答案:

答案 0 :(得分:0)

您应该可以通过指定the tzinfo argument to TruncDay

来获得所需内容
  

tzinfo 子类(通常由 pytz 提供)可以传递以截断特定时区的值。

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