DjangoのORMを使用して最大値に基づいて、単一の子の行をフェッチ
-
06-09-2019 - |
質問
私は別のモデル、「契約」への1対多の関係を持っているモデル、「市場」があります:
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を使用せずにこれを実装する方法はありますか?ある場合は、1がパフォーマンスの点で好ましいすべき?
解決
ジャンゴ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は、余分なを使用しています(あなたのクエリがないなど)サブクエリの代わりに参加します。特にデータベースシステムを知らなくても、より高速であるクエリ伝えることは困難です。私はあなたには、いくつかのベンチマークを行うと決めることを示唆しています。
所属していません StackOverflow