2011-08-11 4 views
7

열에 최대/최소값을 가진 레코드를 기반으로 장고 쿼리를 필터링하는 쉬운 방법이 있습니까? 나는 본질적으로 thesequestions을 요구하고있다. 그러나 Django의 ORM의 특정 맥락에서.최대 열 값으로 레코드로 장고 쿼리 필터링

나는 모두의 전화 번호의 역사적 가치를 저장하도록 설계된 모델이 있다고 가정 해보십시오. 기록에

class Person(models.Model): 
    name = models.CharField(max_length=100) 
    phone = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 

:

Person(name='Jim',phone='123-456-9870', created=datetime(2005,1,2,4,2)) 
Person(name='Jim',phone='329-802-9870', created=datetime(2006,9,2,7,8)) 
Person(name='Sue',phone='324-345-3450', created=datetime(2008,7,4,6,1)) 

는 이제 모든 사람의 가장 최근의 전화 번호를 찾을 싶어 말한다.

SQL에서

, 나는 보통 최대 값을 계산하는 하위 쿼리를 사용해야 할 것 :이 작업을 단순화 할 수 장고의 모든 메커니즘이

SELECT p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 

있습니까?

필자는 백엔드에서 PostgreSQL을 사용하고 있으므로 PostgreSQL 특정 기능에 의존하는 생각이나 해결책이 도움이 될 것입니다.

+0

django에서 원시 쿼리 SQL을 사용하지 않으면 찾고있는 것을 수행 할 수없는 것 같습니다. [this] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct)를 확인하십시오. 현재 작성한 order_by ('created')를 쿼리의 select에 추가하기 때문에 distinct는 아무 것도 수행하지 않습니다. – Hassek

답변

4

여기서 원시 SQL을 사용하기 만하면 raw() 관리자 메소드가이를 용이하게하여 쿼리에서 모델 인스턴스를 리턴 할 수 있습니다. 유일한 트릭은 원시 쿼리가 기본 키를 포함해야한다는 것입니다. (당신이 id 이외의 기본 키 설정이없는 경우) 이것은 아마도 당신을 위해 일해야합니다

latest_phone_numbers = Person.objects.raw(''' 
SELECT p1.id, p1.name, p1.phone, p1.created 
FROM person_person p1, (
    SELECT name, MAX(created) AS max_created 
    FROM person_person 
    GROUP BY name 
) AS p2 
WHERE p1.name = p2.name AND p1.created = p2.max_created 
''') 
1

를 백엔드가 PostgreSQL을 Roman Pekarthis 질문에 대한 좋은 답변을 준 경우.