Получение родителей путем фильтрации двух диапазонов дат в таблице childs с помощью Django ORM
У меня есть две таблицы с этой информацией:
Комната
| id | room name |
|---|---|
| 1 | room 1 |
| 2 | room 2 |
и дочерняя таблица с этой информацией:
Резервирование
| id | room id (reserved_rooms) | from date | to date |
|---|---|---|---|
| 1 | 1 | 2022-05-20 | 2022-05-22 |
| 2 | 1 | 2022-05-23 | 2022-05-25 |
Я хочу получить доступные номера за определенное количество времени:
- У ведьмы нет бронирования
- комнаты, в которых не было забронировано определенное время, например
2022-05-24
Я попробовал следующий код, но проблема в том, что забронированный номер возвращается с id=1, в то время как он имеет бронь на нужную дату.
Room.objects.filter(Q(reserved_rooms__isnull=True) |
Q(reserved_rooms__from_date__gt=date) |
Q(reserved_rooms__to_date__lt=date))
Этот запрос проигнорировал бронирование с id=2, потому что 2022-05-23 < 2022-05-24 < 2022-05-25, но бронирование с id=1 приводит к тому, что возвращается номер с id=1. потому что 2022-05-24 не в диапазоне 2022-05-20 и 2022-05-22.
Поэтому я ожидал, что будет возвращена только комната с id=2, но были возвращены и 1, и 2.
Каково ваше предложение по решению этой проблемы?
Что касается
qs1 = Room.objects.filter( Q(reserved_rooms__isnull=True) )
qs2 = Room.objects.exclude( reserved_rooms__isnull=True
).exclude( reserved_rooms__from_date__gt=date,
reserved_rooms__to_date__lt=date )
)
result = q1.union(q2)
Я не уверен, нужно ли .exclude( reserved_rooms__isnull=True) в qs2, но сомневаюсь, что это стоит того, чтобы выяснять! Второй exclude с двумя аргументами - это обычная and-логика.