如何在每个日期的两个日期范围之间获取 obj

Posted

技术标签:

【中文标题】如何在每个日期的两个日期范围之间获取 obj【英文标题】:How can get obj between two date range for each date 【发布时间】:2019-03-24 01:21:50 【问题描述】:

我在 Postgres 数据库中有这样的数据,基于我的模型 Event

 | id |  name  |    start_date       |      end_date       |
   1    Event1  2018-09-14 14:22:00     2018-09-15 14:22:00
   2    Event2  2018-09-15 14:22:00     2018-09-15 15:22:00

我需要返回响应 group_by 日期,如果事件持续时间(end_date,start_date)花了 2 天,所以我需要在两天内返回他两次,这一切都应该按日期排序。 所以响应应该是这样的:

    
      "2018-09-14": [
          
            "id": 1,
            "name": "Event1",
            "start_date": "2018-09-14 14:22:00",
            "end_date": "2018-09-15 14:22:00",
        ],
        "2018-09-15": [
            "id": 1,
            "name": "Event1",
            "start_date": "2018-09-14 14:22:00",
            "end_date": "2018-09-15 14:22:00",
        ,
        
            "id": 2,
            "name": "Event2",
            "start_date": "2018-09-15 14:22:00",
            "end_date": "2018-09-15 15:22:00",
        ]
     

我该怎么做?

【问题讨论】:

【参考方案1】:

您的示例数据不是 Django 模型,它只是一个普通的 Python dict

data = [
    
        "id": 1,
        "name": "Event1",
        "start_date": "2018-09-14 14:22:00",
        "end_date": "2018-09-15 14:22:00",
    ,
    
        "id": 2,
        "name": "Event2",
        "start_date": "2018-09-15 14:22:00",
        "end_date": "2018-09-15 15:22:00",
    ,
]

您可以简单地对其进行迭代并构建所需的结果dict

from collections import defaultdict

result = defaultdict(list)

for item in data:
    start_date = item['start_date'][:10]
    end_date = item['end_date'][:10]

    result[start_date].append(item)

    if start_date != end_date:
        result[end_date].append(item)

【讨论】:

我现在添加这个作为我的响应示例。我想你可以理解我的模型现在的样子。我想我可以构建查询集,给我想要的结果。【参考方案2】:

好的。我为此找到了决定

1) 首先我找到我需要的 SQL

"SELECT DISTINCT generate_series(start_date::date, end_date::date, '1 day'::interval) AS dates, * FROM api_event ORDER BY dates")

2) 其次,我在 Django ORM 上写这个:

Event.objects.annotate(dates=Func(F('start_date'), F('end_date'), Value('1 day'), function='generate_series')).all()

所以我得到了我想要的列表:

[
    "id": 1,
    "name": "Event1",
    "dates": "2018-09-14",
    "start_date": "2018-09-14 14:22:00",
    "end_date": "2018-09-15 14:22:00"
, 
    "id": 1,
    "name": "Event1",
    "dates": "2018-09-15",
    "start_date": "2018-09-14 14:22:00",
    "end_date": "2018-09-15 14:22:00"
, 
    "id": 2,
    "name": "Event2",
    "dates": "2018-09-15",
    "start_date": "2018-09-15 14:22:00",
    "end_date": "2018-09-15 15:22:00"
]

这个回复对我来说很好。

【讨论】:

以上是关于如何在每个日期的两个日期范围之间获取 obj的主要内容,如果未能解决你的问题,请参考以下文章

如何在日期范围内获取数据?

在 R 中:如何在两个日期之间按组对变量求和

斯威夫特:如何设置两个日期之间的照片范围?

如何在没有周末的情况下获取日期范围之间的所有日期?

如何获取日期范围内的缺失值?

如何使用命令提示符复制在两个日期之间创建的所有文件?