Форум сайта python.su
Приветствую, коллеги.
На новом проекте решил изучить python и django. Совместить, так сказать, приятное с полезным.
Возник один момент, в котором нужна ваша помощь.
На сайте есть поиск комнат по времени. Связь комнаты (room) к брони (booking) многие ко многим.
SQL запрос для выбора свободных номеров на время будет выглядеть как то так:
select r.* from room as r left join room_booking as sb on (sb.room_id = r.id) left join booking as b on (sb.booking_id = b.id and b.date_from >="{0}" and b.date_to<"{1}") where b.id is null ....
Офлайн
как-то так видимо
qs=Room.objects.filter(booking_set__date_from__gte=start, booking_set__date_from__lt=end)
Офлайн
Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо
Офлайн
sanchezА, понял, тогда filter надо поменять на exclude
Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо
Офлайн
а это мысль, спасибо. Опробую на днях
Офлайн
Не подходит вариант с exclude. Если посмотреть запрос, который получается в итоге, таблицы объединяються через inner join, что не подходит. Необходимо, чтобы объединение происходило через left join.
Люди, хээлп!
Офлайн
Видимо, победил. Для интересующихся вот результирующий код:
res=Room.objects.filter(Q(state__exact=1), Q(sauna__state__exact=1), Q(booking__isnull=True) | Q( Q(booking__date_to__lte=dt['date_from']) | Q(booking__date_from__gte=(dt['date_to'])) ) ).distinct()
Офлайн
А вот и фиг там - данный запрос тоже не подходит. Все же нужно джойнить по условию, иначе никак. А глядя на ссылки:
http://python.6.n6.nabble.com/Implicit-where-td4982310.html
https://groups.google.com/forum/?fromgroups=#!topic/django-users/QPMIHMKVXhc
Вобщем, нету в ORM такого функционала. Весь день убил, фааак
Офлайн