Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 9, 2012 20:04:33

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

Приветствую, коллеги.
На новом проекте решил изучить 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), что доставляет неудобства с пэджингом.
Заранее спасибо

Офлайн

#2 Сен. 10, 2012 15:58:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

join по условию в filter()

как-то так видимо

qs=Room.objects.filter(booking_set__date_from__gte=start, booking_set__date_from__lt=end)



Офлайн

#3 Сен. 10, 2012 17:04:45

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо

Офлайн

#4 Сен. 11, 2012 05:33:09

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

join по условию в filter()

sanchez
Да нее. так же он выберет комнаты, у которых ЕСТЬ бронь но не на текущий момент, т.е., например, сюда не попадут комнаты, у которых никогда не было брони. Но все равно спасибо
А, понял, тогда filter надо поменять на exclude



Офлайн

#5 Сен. 12, 2012 20:19:17

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

а это мысль, спасибо. Опробую на днях

Офлайн

#6 Сен. 16, 2012 14:35:36

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

Не подходит вариант с exclude. Если посмотреть запрос, который получается в итоге, таблицы объединяються через inner join, что не подходит. Необходимо, чтобы объединение происходило через left join.
Люди, хээлп!

Офлайн

#7 Сен. 16, 2012 16:30:19

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

Видимо, победил. Для интересующихся вот результирующий код:

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? Джанга такая джанга

Офлайн

#8 Сен. 16, 2012 19:25:18

sanchez
Зарегистрирован: 2012-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

join по условию в filter()

А вот и фиг там - данный запрос тоже не подходит. Все же нужно джойнить по условию, иначе никак. А глядя на ссылки:
http://python.6.n6.nabble.com/Implicit-where-td4982310.html
https://groups.google.com/forum/?fromgroups=#!topic/django-users/QPMIHMKVXhc
Вобщем, нету в ORM такого функционала. Весь день убил, фааак

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version