簡體   English   中英

在Django時區感知設置下查詢每小時點擊數

[英]Querying hits per hour on Django timezone aware setup

我是整個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創建了以下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不喜歡那樣。

如前所述,我仍然對它的工作原理有所了解,因此歡迎您提出任何指針,評論或鼓勵之詞。

通過TruncDay指定tzinfo參數,您應該能夠獲得所需的內容:

可以傳遞通常由pytz提供的tzinfo子類來截斷特定時區中的值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM