django orm을 사용하여 최대 값을 기준으로 한 싱글 아동 행을 가져 오기

StackOverflow https://stackoverflow.com/questions/931730

문제

나는 다른 모델과 일대일 관계를 가진 "시장"이라는 모델이 있습니다.

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는 쿼리처럼 하위 쿼리 대신 추가 조인을 사용합니다. 특히 데이터베이스 시스템을 알지 못하고 어떤 쿼리가 더 빠르는지 알기가 어렵습니다. 벤치 마크를하고 결정하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top