Набор запросов: ЛЕВОЕ СОЕДИНЕНИЕ с И

#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