2011-08-04 2 views
11

: DB에장고 ORM : 나는 다음과 같다 모델이 그룹과 최대

Requests: user, req_time, req_text 

을, 기록은 다음과 같이 할 수 있습니다

id, user_id, req_time, req_text 
1  1  TIMESTAMP YES 
2  1  TIMESTAMP NO 
3  2  TIMESTAMP YES 

어떻게 장고 ORM 쿼리를 작성합니까? 사용자 별 요청을 그룹화하고 req_text를 기반으로 요청을 필터링하며 결과 집합의 최대 ID를 선택합니다. 따라서 각 사용자에 대해 필터 조건과 일치하는 행 하나를 반환하고 가장 큰 ID를 갖습니다.

답변

10
from django.db.models.aggregates import Max 

request_values = Requests.objects.filter(req_text='YES') \ 
       .values('user') \ 
       .annotate(max_id=Max('id')) 

다음 request_values는 다음과 같이 표시됩니다

[ 
    {'user': 1, 'max_id': 1}, 
    {'user': 2, 'max_id': 4}, 
    {'user': 3, 'max_id': 5}, 
    {'user': 4, 'max_id': 12}, 
    ... 
] 
+1

유형 (request_values를) == django.db.models.query.ValuesQuerySet하지만 ValuesQuerySet의 요소를 사전하며 더 이상 객체를 장고 없습니다. 해당 쿼리에서 QuerySet을 가져 오는 방법이 있습니까? – kev

+1

@kev 결과의 각 행이 더 이상 테이블의 단일 행을 나타내지 않으므로 GROUP BY 쿼리에서 모델 인스턴스를 요청하는 것이 바람직하지 않습니다. – Anentropic

+0

예, 절대적으로 의미가 있습니다. – kev

관련 문제