Получение родителей путем фильтрации двух диапазонов дат в таблице 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-логика.