首页 > 解决方案 > 如何在每个日期的两个日期范围之间获取 obj

问题描述

根据我的模型事件,我在 Postgres 数据库中有这样的数据

 | 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",
        }]
     }

我怎样才能做到这一点?

标签: sqldjangopostgresqldjango-rest-frameworkdjango-queryset

解决方案


行。我为此找到了决定

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"
}]

这个回应对我来说很好。


推荐阅读