[每天使用Django ORM计算不同时区的事件类型

问题描述 投票:0回答:1

我们有一个表,其中包含多个事件及其添加时间。用于存储事件的默认时区为UTC。例如:

class Events:
    type = models.CharField(max_length=45, null=False)
    date_added = models.DateTimeField(auto_now_add=True)

现在,我们希望获取两个日期-开始日期和结束日期之间每天不同事件类型的计数。例如:对于start_date =“ 2020-03-1”和end_date =“ 2020-03-31”,输出应为-

[{
    "date" : "2020-03-1",
    "event1" : 200,
    "event2" : 606,
    "event3" : 595
},
{
    "date" : "2020-03-2",
    "event1" : 357,
    "event2" : 71,
    "event3" : 634
},
{
    "date" : "2020-03-3",
    "event1" : 106,
    "event2" : 943,
    "event3" : 315
},
{
    "date" : "2020-03-4",
    "event1" : 187,
    "event2" : 912,
    "event3" : 743
},
.
.
.
.
{
    "date" : "2020-03-31",
    "event1" : 879,
    "event2" : 292,
    "event3" : 438
}]

由于用户所在的时区不同(美国,欧洲,亚洲等),因此我们希望在对事件进行计数之前按用户转换时区。在用户所在的时区中,每天使用UTC进行计数会有错误的计数。例如:3月3日上午1:30在IST创建的活动将在UTC于3月2日晚上8点显示,并进行相应计数。

如果使用for

循环,它将变得非常昂贵。因此,我们想使用Django ORM在数据库级别上做到这一点。如果不可能完全依赖Django ORM,我们希望使其尽可能高效。

我们可以提出的最佳查询是:

 Events.objects.filter(
    pk = user_pk, date__range = (
        (end_date - time_delta).strftime("%Y-%m-%d"), 
        end_date.strftime("%Y-%m-%d")
        )
    ).extra({
        "date_added" : "date(date_added)"
    }).values(
        "date_added", 
        "type"
    ).annotate(
        models.Count("type")
    ) 

我们在哪里得到类似的结果:

<QuerySet [{'date_added': datetime.date(2020, 3, 6), 'type': 'event1', 'type__count': 30}, 
{'date_added': datetime.date(2020, 3, 6), 'type': 'event2', 'type__count': 189}, 
{'date_added': datetime.date(2020, 3, 6), 'type': 'event3', 'type__count': 1}, 
{'date_added': datetime.date(2020, 3, 6), 'type': 'event4', 'type__count': 3}, 
{'date_added': datetime.date(2020, 3, 9), 'type': 'event2', 'type__count': 57}, 
{'date_added': datetime.date(2020, 3, 9), 'type': 'event1', 'type__count': 23}, 
{'date_added': datetime.date(2020, 3, 9), 'type': 'event4', 'type__count': 1}, 
{'date_added': datetime.date(2020, 3, 10), 'type': 'event1', 'type__count': 5}, 
{'date_added': datetime.date(2020, 3, 10), 'type': 'event2', 'type__count': 21}, 
{'date_added': datetime.date(2020, 3, 11), 'type': 'event2', 'type__count': 9}, 
{'date_added': datetime.date(2020, 3, 11), 'type': 'event1', 'type__count': 15}, 
{'date_added': datetime.date(2020, 3, 12), 'type': 'event2', 'type__count': 49}, 
{'date_added': datetime.date(2020, 3, 13), 'type': 'event2', 'type__count': 8}, 
{'date_added': datetime.date(2020, 3, 13), 'type': 'event1', 'type__count': 3}, 
{'date_added': datetime.date(2020, 3, 17), 'type': 'event1', 'type__count': 16}, 
{'date_added': datetime.date(2020, 3, 17), 'type': 'event2', 'type__count': 26}, 
{'date_added': datetime.date(2020, 3, 17), 'type': 'event4', 'type__count': 1}, 
{'date_added': datetime.date(2020, 3, 17), 'type': 'event3', 'type__count': 1}, 
{'date_added': datetime.date(2020, 3, 18), 'type': 'event2', 'type__count': 64}, 
{'date_added': datetime.date(2020, 3, 18), 'type': 'event1', 'type__count': 11}, 
'...(remaining elements truncated)...']>

这仍然需要for

循环才能将所有具有相同日期的事件添加到一个字典中,但是时区问题仍然存在。

如何解决这个问题?

我们有一个表,其中包含多个事件及其添加时间。用于存储事件的默认时区为UTC。例如:类事件:类型= models.CharField(max_length = 45,null = False)...

python django django-models mysql-python django-timezone
1个回答
0
投票

我们终于能够解决这个问题。我们仍在使用for循环来获取所需格式的数据,但是我们能够将繁重的工作转移到DB上。首先是几件事:

© www.soinside.com 2019 - 2024. All rights reserved.