Как сравнить поля одного и того же экземпляра связанной модели в наборе запросов - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть модель продукта. Продукт можно арендовать, и каждая аренда - это объект, состоящий из 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. Но безуспешно.

Короткий вопрос: Как отфильтровать мой набор запросов, чтобы исключить все продукты, чьи бронирования перекрываются датами, указанными пользователем

Заранее благодарим за поддержку!

...