Я только что нашел решение для подобного варианта использования - возможно, кто-то найдет это полезным:
В моем случае, у меня есть модели доступности и ограничения, например (упрощенно):
class Availability(...):
start = models.DateTimeField()
end = models.DateTimeField()
class Constraint(...):
from = models.TimeField()
to = models.TimeField()
Я хотел найти возможности, которые не нарушают никаких ограничений.
С Postgres это сработало для меня:
Availability.objects.extra(
where=['NOT (start::time, "end"::time) OVERLAPS (\'{0}\'::time, \'{1}\'::time)'.format(
from.strftime("%H:%M"), to.strftime("%H:%M")
)]
)
Обратите внимание, как вы можете привести DateTime
к Time
(точнее timestamp
к time without timezone
в терминах Postgres) с ::time
и затем использовать OVERLAPS
для сравнения временных диапазонов.
А что касается исходного вопроса, вы также можете сделать:
Availability.objects.extra(
where=['start::time BETWEEN \'{0}\'::time AND \'{1}\'::time AND
"end"::time BETWEEN \'{0}\'::time AND \'{1}\'::time'.format(
from.strftime("%H:%M"), to.strftime("%H:%M")
)]
)