Как можно получить объект между двумя диапазонами дат для каждой даты - PullRequest
0 голосов
/ 19 октября 2018

У меня есть данные в базе данных 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 date, и если длительность события (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",
        }]
     }

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Хорошо.Я нахожу решение для этого

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

Этот ответ хорош для меня.

0 голосов
/ 19 октября 2018

Данные вашего примера не являются моделью 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)
...