【问题标题】:How can get obj between two date range for each date如何在每个日期的两个日期范围之间获取 obj
【发布时间】: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",
        }]
     }

我该怎么做?

【问题讨论】:

    标签: sql django postgresql django-rest-framework django-queryset


    【解决方案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"
    }]
    

    这个回复对我来说很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2023-03-30
      • 2020-10-09
      • 2011-03-22
      相关资源
      最近更新 更多