2011-04-28 97 views
7

我使用旧Django版本1.1与黑客,支持加入extra()。它有效,但现在是时候进行更改了。 Django 1.2使用RawQuerySet,因此我已经为该解决方案重写了我的代码。问题是,RawQuery不支持过滤器等,我有很多代码。 通过Google挖掘,on CaktusGroup我发现,我可以使用query.join()。 这将是巨大的,但在我的代码有:QuerySet:左加入和

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",但我不知道如何在第二部分之后,并添加。
是否存在Django的任何解决方案,我可以使用自定义JOIN而无需重写所有过滤器代码(Raw)?

这是额外的我们当前的代码片段()

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

不幸的是,这里的答案是否定的。

Django ORM与大多数Django一样遵循一个哲学,即简单的事情应该是容易的,而且应该是可能的。在这种情况下,您肯定处于“困难的事情”领域,而“可能的”解决方案就是简单地编写原始查询。确实存在这样的情况,在这种情况下,编写原始查询可能很困难,并且感觉有点严重,但从项目角度来看,这样的情况太少,不足以证明增加这种功能的成本。

+0

好的,谢谢。我想,这可能存在某种黑客攻击。 – 2011-05-14 17:33:41