QuerySet: СЛЕВАЯ СОЕДИНЕНИЕ с И - PullRequest
7 голосов
/ 28 апреля 2011

Я использую старую версию Django 1.1 с хаком, который поддерживает 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, чтобы я мог использовать пользовательские JOIN, не переписывая весь код фильтров (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'],  
     )

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

К сожалению, ответ здесь - нет.

Django ORM, как и большинство Django, следует философии, согласно которой простые вещи должны быть простыми, а сложные - возможными. В этом случае вы определенно находитесь в области «сложных вещей», и «возможное» решение - просто написать необработанный запрос. Определенно, существуют ситуации, подобные этой, когда написание необработанного запроса может быть трудным и кажется довольно грубым, но с точки зрения проекта подобные ситуации слишком редки, чтобы оправдать затраты на добавление такой функциональности.

0 голосов
/ 16 марта 2012

Попробуйте этот патч: https://code.djangoproject.com/ticket/7231

...