Запрос на Python/Django для проверки совпадения дат
Я пытаюсь настроить валидацию на API, построенном с помощью Python/Django. Я использую сериализатор и хотел бы сделать фильтр запроса к данным поста, чтобы убедиться, что 2 поля даты не пересекаются. Например: Мой пост содержит:
"valid_start": "2021-09-01",
"valid_end": "2021-09-15"
Я хочу с помощью object.filter проверить, есть ли в моей базе данных записи с перекрывающимися датами: Я хочу выдать ошибку валидации, если запрос обнаружит что-либо из следующего
"valid_start": "2021-09-01",
"valid_end": "2021-09-15"
"valid_start": "2021-09-02",
"valid_end": "2021-09-15"
"valid_start": "2021-09-03",
"valid_end": "2021-09-10"
"valid_start": "2021-08-28",
"valid_end": "2021-09-20"
Я пробовал функцию __range, функции gte/lte, ни одна из них не делает того, чего я пытаюсь достичь. Спасибо!
Let us first determine when two date ranges do not overlap. These do not overlap if end1 < start2 or end2 < start1. The opposite of this condition is end1 ≥ start2 and end2 ≥ start1, we thus can query with:
MyModel.objects.filter(
valid_end__gte=valid_start,
valid_start__lte=valid_end
)
Где valid_start
и valid_end
- начальная и конечная даты, которые вы хотите вставить. Если такая запись существует, то вы пытаетесь вставить запись с хотя бы некоторым перекрытием. Если такая запись не найдена путем фильтрации, то она не будет перекрываться с новой создаваемой записью.