2009-05-31 24 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

相关问题