#python #sql #django #left-join
#python #sql #django #левое соединение
Вопрос:
Я использую старую версию Django 1.1 с hack, которая поддерживает join в extra(). Это работает, но сейчас пришло время для изменений. Django 1.2 использует RawQuerySet, поэтому я переписал свой код для этого решения. Проблема в том, что rawQuery не поддерживает фильтры и т.д. которых у меня много в коде. Покопавшись в Google, в CaktusGroup я обнаружил, что мог бы использовать query.join(). Это было бы здорово, но в коде, который я:
LEFT OUTER JOIN "core_rating" ON
("core_film"."parent_id" = "core_rating"."parent_id"
AND "core_rating"."user_id" = %i
В query.join() я написал первую часть "core_film"."parent_id" = "core_rating"."parent_id"
, но я не знаю, как добавить вторую часть после AND .
Существует ли какое-либо решение для Django, чтобы я мог использовать пользовательские соединения без перезаписи всего кода фильтров (Raw)?
Это наш текущий фрагмент кода в extra()
top_films = top_films.extra(
select=dict(guess_rating='core_rating.guess_rating_alg1'),
join=['LEFT OUTER JOIN "core_rating" ON ("core_film"."parent_id" = "core_rating"."parent_id" and "core_rating"."user_id" = %i)' % user_id] extra_join,
where=['core_film.parent_id in (select parent_id from core_film EXCEPT select film_id from filmbasket_basketitem where "wishlist" IS NOT NULL and user_id=%i)' % user_id,
'( ("core_rating"."type"=1 AND "core_rating"."rating" IS NULL) OR "core_rating"."user_id" IS NULL)',
' "core_rating"."last_displayed" IS NULL'],
)
Ответ №1:
К сожалению, ответ здесь отрицательный.
Django ORM, как и большинство Django, придерживается философии, согласно которой простые вещи должны быть легкими, а сложные — возможными. В этом случае вы определенно находитесь в области «сложных вещей», и «возможное» решение — просто написать необработанный запрос. Определенно, бывают ситуации, подобные этой, когда написание необработанного запроса может быть затруднено и кажется довольно грубым, но с точки зрения проекта ситуации, подобные этой, слишком редки, чтобы оправдать затраты на добавление такой функциональности.
Комментарии:
1. Хорошо, спасибо. Я подумал, что, возможно, существует какой-то хак для этого.
Ответ №2:
Попробуйте этот патч: https://code.djangoproject.com/ticket/7231