django orm을 사용하여 최대 값을 기준으로 한 싱글 아동 행을 가져 오기
-
06-09-2019 - |
문제
나는 다른 모델과 일대일 관계를 가진 "시장"이라는 모델이 있습니다.
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을 사용하지 않고이를 구현할 수있는 방법이 있습니까? 존재한다면 성능 측면에서 어떤 것이 선호되어야합니까?
해결책
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는 쿼리처럼 하위 쿼리 대신 추가 조인을 사용합니다. 특히 데이터베이스 시스템을 알지 못하고 어떤 쿼리가 더 빠르는지 알기가 어렵습니다. 벤치 마크를하고 결정하는 것이 좋습니다.
제휴하지 않습니다 StackOverflow