开发者

QuerySet: LEFT JOIN with AND

开发者 https://www.devze.com 2023-03-01 01:33 出处:网络
I use old Django version 1.1 with hack, that support join in extra(). It works, but now is time for changes. Django 1.2 use RawQuerySet so I\'ve rewritten my code for that solution. Problem is, that R

I use old Django version 1.1 with hack, that support join in extra(). It works, but now is time for changes. Django 1.2 use RawQuerySet so I've rewritten my code for that solution. Problem is, that RawQuery doesn't support filters etc. which I have many in code. Digging through Google, on CaktusGroup I've found, that I could use query.join(). It would be great, but in code I have:

LEFT OUTER JOIN "core_rating" ON 
("core_film"."parent_id" = "core_rating"."parent_id" 
AND "core_rating"."user_id" = %i

In query.join() I've written first part "core_film"."parent_id" = "core_rating"."parent_id" but I don't know how to add the second part after AND.

Does there exist any solution for Django, that I could use custom JOINs without rewritting all the filters code (Raw)?

T开发者_如何转开发his is our current fragment of code in 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'],  
     )


Unfortunately, the answer here is no.

The Django ORM, like most of Django, follows a philosophy that easy things should be easy and hard things should be possible. In this case, you are definitely in the "hard things" area and the "possible" solution is to simply write the raw query. There are definitely situations like this where writing the raw query can be difficult and feels kinda gross, but from the project's perspective situations like this are too rare to justify the cost of adding such functionality.


Try this patch: https://code.djangoproject.com/ticket/7231

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号