2009-05-31 27 views
3

我有了一個一對多的關係到另一個模型的模型,「市場」,「合同」的基礎上一個最大值單個子行:獲取使用Django ORM

class Market(models.Model): 
    name = ... 
    ... 

class Contract(models.Model): 
    name= ... 
    market = models.ForeignKey(Market, ...) 
    current_price = ... 

我會喜歡以各自的最高價格與合約一起獲取市場對象。這是我想通過原始SQL做到這一點:

SELECT M.id as market_id, M.name as market_name, C.name as contract_name, C.price 
as price from pm_core_market M INNER JOIN 
    (SELECT market_id, id, name, MAX(current_price) as price 
     FROM pm_core_contract GROUP BY market_id) AS C 
ON M.id = C.market_id 

是否有實現這個沒有使用SQL的方式?如果有的話,哪一個應該在性能方面更受歡迎?

回答

9

Django 1.1(目前測試版)增加了支持數據庫API的aggregation。您的查詢可以做這樣的:

from django.db.models import Max, F 

Contract.objects.annotate(max_price=Max('market__contract__current_price')).filter(current_price=F('max_price')).select_related() 

這將生成以下SQL查詢:

SELECT contract.id, contract.name, contract.market_id, contract.current_price, MAX(T3.current_price) AS max_price, market.id, market.name 
FROM contract LEFT OUTER JOIN market ON (contract.market_id = market.id) LEFT OUTER JOIN contract T3 ON (market.id = T3.market_id) 
GROUP BY contract.id, contract.name, contract.market_id, contract.current_price, market.id, market.name 
HAVING contract.current_price = MAX(T3.current_price) 

API使用一個額外的加入,而不是一個子查詢(如查詢一樣)。很難判斷哪個查詢更快,特別是在不知道數據庫系統的情況下。我建議你做一些基準並做出決定。

+0

我假設子查詢比兩個JOIN更高效,但你說得對,不應該假設;進行基準測試並查看。 – 2009-05-31 14:02:11

相關問題