3

我有一个模型“市场”,它与另一个模型“合同”有一对多的关系:

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

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

我想获取 Market 对象以及每个合约的最高价格。这就是我通过原始 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 的情况下实现这一点?如果有,在性能方面应该首选哪一个?

4

1 回答 1

9

Django 1.1(目前为测试版)为数据库 API 添加了聚合支持。您的查询可以这样完成:

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 使用额外的连接而不是子查询(就像您的查询一样)。很难判断哪个查询更快,尤其是在不了解数据库系统的情况下。我建议你做一些基准测试并做出决定。

于 2009-05-31T10:00:35.917 回答