Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QuerySet: LEFT JOIN with AND

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)?

This 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'],  
     )
like image 758
dasm Avatar asked Apr 28 '11 08:04

dasm


1 Answers

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.

like image 134
SeanOC Avatar answered Nov 09 '22 12:11

SeanOC