2011-04-28 104 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