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

Я хочу получить доступные номера за определенное количество времени:

  1. У ведьмы нет бронирования
  2. комнаты, в которых не было забронировано определенное время, например 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-логика.

Вернуться на верх