Создание нескольких объектов со случайными датами начала и окончания, которые НИКОГДА не перекрываются? - PullRequest
3 голосов
/ 21 октября 2019

Я создаю 20 случайных объектов для своих приборов следующим образом:

EVENT_TYPE = [
    'A',
    'B',
    'C',
]


for _ in range(20):
        start_date = get_random_date(date(date.today().year, 1, 1), now())

        Event.objects.create(
            category=random.choice(EVENT_TYPE),
            start=start_date,
            end=get_random_date(start_date, start_date + timedelta(days=180)),
        )

Что я хочу сделать: иметь 20 объектов с «уникальными» диапазонами дат. Например, Object1 начинается 01.01.2019 и заканчивается 10.01.2019 и имеет EVENT_TYPE «A». Поэтому ни у одного другого созданного объекта не должно быть диапазона дат между этими двумя датами с одинаковым EVENT_TYPE. У них может быть начальная дата в 10.01.2019 или конечная дата в 01.01.2019, но между этими датами никогда ничего не должно быть.

НО, как вы можете видеть, у моих объектов также есть категории, которые разделяют их, поэтому, если obj1 и obj2 имеют одинаковый диапазон дат, но разные EVENT_TYPE, это совершенно нормально.

Прямо сейчасмой код делает это совершенно случайно. Я пытался найти способ достичь этого, но просто не смог придумать умную идею. Кто-нибудь знает умное решение этой проблемы? Как я могу проверить, находится ли один объект между диапазоном дат другого, и, скажем, просто изменить его дату на начало или конец этого объекта, чтобы он точно не перекрывался?

Спасибо за любой ответ! :)

1 Ответ

1 голос
/ 21 октября 2019

Создать словарь, содержащий текущие даты, такие как:

current_dates = {
    'A': date(2019, 3, 5)
    'B': date(2019, 1, 1)
    'C': date(2019, 5, 4)
}

Выберите дату начала для типа из current_dates. После произвольно выбранной даты окончания укажите ее в качестве даты начала для типа и обновите словарь current_dates.

for _ in range(20):
    category = random.choice(EVENT_TYPE)
    start_date = current_dates[category]
    end_date = get_random_date(start_date, start_date + timedelta(days=180))
    Event.objects.create(
        category=category,
        start=start_date,
        end=end_date,
    )
    current_dates[category] = end_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...