У меня есть модель продукта. Продукт можно арендовать, и каждая аренда - это объект, состоящий из date_start и date_end
class Product(model.Model):
field1= model.Charfield(...)
field2= model.Charfield(...)
class Rental(model.Mode):
product = model.ForeignKey(Product, related_query_name='rental')
date_start = model.DateField()
date_end = model.DateField()
Я делаю форму, которая возвращает все доступные продукты на основе периода, заданного пользователем (user_date_start и user_date_end) .. Существует уравнение, которое работает для этого, оно говорит вам, есть ли совпадение ваших дат: источник
(StartA <= EndB) and (EndA >= StartB)
Я запускаю свой набор запросов следующим образом:
qs= Product.objects.exclude(rental__date_start__lt = user_date_end, rental__date_end__gt = user_date_start)
Я хорошо работаю, когда у меня есть только одно бронирование продукта. НО, когда у меня уже есть несколько резервирований, происходит сбой из-за того, что он объединяет все «date_start» вместе и все «date_end» вместе. Допустим, для моего продукта у меня есть даты 14-16 / 04/2020 и 20-25 / 04 в базе данных, набор запросов исключит промежуточные даты (например, 17-19 / 04).
Потому что (17 <25) и (19> 14).
Я бы хотел попросить мой набор запросов сравнить date_start и date_end одного и того же объекта Rental, а не все date_start и все date_end без их соответствующих привязок, но я не могу понять, как. Я пытался использовать функции Q и F. Но безуспешно.
Короткий вопрос: Как отфильтровать мой набор запросов, чтобы исключить все продукты, чьи бронирования перекрываются датами, указанными пользователем
Заранее благодарим за поддержку!