2012-01-12 43 views
1

有沒有人有這種類型的API調用的難度:訂購多對多場的數量在Django

projects.annotate(votes_count=Count('votes')).order_by('votes_count') 

這對我來說速度奇慢,我發現此相關的問題:

https://code.djangoproject.com/ticket/17144

我想知道是否有其他人遇到與此相關的問題或者有很好的解決方法?這似乎是一個普遍的API調用,我很驚訝這個bug沒有更多的牽引力。

+0

如果可能的話,您應該轉儲sql並執行一些數據庫調優 – zsong 2012-01-12 18:17:33

回答

1

該票特別提到MySQL。我使用PostgreSQL並始終使用註釋,沒有明顯的緩慢。但是,我從來沒有專門檢查過生成的SQL,看看它是否在做同樣的事情。

如果你正在使用MySQL,它似乎你可能有以下選擇(雖然,他們沒有特別真棒):

  1. 切換到PostgreSQL的。如果我的軼事證據和票據中關於PostgreSQL的投訴都沒有任何跡象,那麼這可能不成問題。

  2. 現在與它一起生活,當它被釋放時升級到1.4。

  3. 爲了獲得修復(現在通常不是一個好主意),或嘗試修補當前的安裝,從主幹上運行。

  4. 使用raw()正如@jknupp所示。

4可能是目前最簡單和最好的方法。除非您將來在某個時刻切換數據庫引擎,否則這不是一個真正的問題,您可以隨時在代碼中記下自己,以便在更新Django時以正確的方式進行。我通常在類似的情況下做類似以下事情:

"""Django has a bug in version 1.3 (see ticket: 
https://code.djangoproject.com/ticket/17144), resulting in unnecessary fields 
being included in the GROUP BY clause and subsequently very slow queries. The raw 
query below can be replaced with the commented line once the issue has been 
corrected. 
""" 
# projects.annotate(votes_count=Count('votes')).order_by('votes_count') 
projects.raw(...) 
1

要解決此問題,您可以使用raw() SQL查詢。這不是最好的方式,但它會起作用。請參閱文檔here