Найти - Пользователи
Полная версия: join по условию в filter()
Начало » Django » join по условию в filter()
1
sanchez
Приветствую, коллеги.
На новом проекте решил изучить 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 ....
Вопрос: Как сделать аналогичный запрос используя filter()?
На данный момент сделано через Room.object.raw(sql), что доставляет неудобства с пэджингом.
Заранее спасибо
FishHook
как-то так видимо

qs=Room.objects.filter(booking_set__date_from__gte=start, booking_set__date_from__lt=end)
sanchez
Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо
FishHook
sanchez
Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо
А, понял, тогда filter надо поменять на exclude
sanchez
а это мысль, спасибо. Опробую на днях
sanchez
Не подходит вариант с exclude. Если посмотреть запрос, который получается в итоге, таблицы объединяються через inner join, что не подходит. Необходимо, чтобы объединение происходило через left join.
Люди, хээлп!
sanchez
Видимо, победил. Для интересующихся вот результирующий код:
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()
Ну вот как об этом можно было догадаться, что нужно использовать booking__isnull=True, чтобы получить left join? Джанга такая джанга
sanchez
А вот и фиг там - данный запрос тоже не подходит. Все же нужно джойнить по условию, иначе никак. А глядя на ссылки:
http://python.6.n6.nabble.com/Implicit-where-td4982310.html
https://groups.google.com/forum/?fromgroups=#!topic/django-users/QPMIHMKVXhc
Вобщем, нету в ORM такого функционала. Весь день убил, фааак
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB