2013-01-09 2 views
6

각 저자 (외래 키와 관련 있음)에 대한 첫 번째 책 (날짜 필드 기준)이있는 쿼리 세트를 가져와야합니다 ... 장고 ORM이 있습니까 (커스텀 SQL 선호는 없지만 수용할만한 커스텀 SQL없이)Django queryset은 날짜에 따라 외래 키의 각 항목을 반환합니다

* 편집 : PostgreSQL과 같은 최신 오픈 소스 백엔드 만 사용하는 대답은 받아 들일 수 있습니다. 순수 사용자 정의 SQL 쿼리보다 선호되는 ORM 기반 솔루션) 당신은 PostgreSQL을 또는 DISTINCT ON을 지원하는 다른 DB 백엔드를 사용하는 경우

Models 
class Book(Model): 
    date = Datefield() 
    author = ForeignKey(Author) 

class Author(Model): 
    name = CharField() 


Book.objects.filter(??) 
+0

나는 어제 거의 같은 질문을 받았다. http://stackoverflow.com/questions/14213333/get-latest-objects-django. 편집 2 섹션 내 현재 해킹입니다. –

+0

글쎄, 내가 PostgreSQL에있어 그래서 나는 별개의 것에 국한되지 않는다 ... 나는 당신의 질문에 기초하여 나의 대답을 찾을 수 있는지 확신하지 못한다. 그러나 포인터에 대한 감사. – eskhool

답변

6

편안한 솔루션이 있습니다 :

Books.objects.order_by('author', '-date').distinct('author') 

그렇지 않으면 하나의 쿼리 만있는 솔루션을 알 수 없습니다. 저자에 의해 .values의 조합()와 .annotate() 우리 그룹과

from django.db.models import Q, Max 
import operator 

books = Book.objects.values('author_id').annotate(max_date=Max('date')) 
filters = reduce(operator.or_, [(Q(author_id=b['author_id']) & 
    Q(date=b['max_date'])) for b in books]) 
queryset = Books.objects.filter(filters) 

을 그 작가의 모든 책의 최신 날짜를 주석 :하지만 당신이 시도 할 수 있습니다. 그러나 그 결과는 단서와 단서가 아닙니다. 그런 다음 WHERE author_id=X1 AND date=Y1 OR author_id=X2 AND date=Y2...과 같은 SQL 문을 작성합니다. 이제 두 번째 쿼리는 쉽습니다.

+0

고마워, 나는 2 쿼리 회신 ... 이것은 가능성이 내가 지금까지 구체적으로 주어진 정확한 질문을 주소로 받아 들여지고 싶습니다 답변을 것입니다,하지만 난 아직도 사용자 정의 SQL과 Django ORM이 일어날 수 있도록 바라고 있어요 단일 쿼리 – eskhool

+0

그럼 당신은 단일 쿼리에서 모든 DB 백엔드에 대한 솔루션을 원한다고 가정합니까? 'Book.objects.raw ('SELECT *, MAX (date) as max_date from myapp_book GROUP BY author_id ')'? – Hannes

+0

postgresql 전용 솔루션에 대한 내 질문 업데이트 ... 여전히 모든 백엔드 작동하지 않는 경우에도 ORM 기반 솔루션을 선호 할 것 ... 사용자 지정 SQL 그냥 더 쉽게 체인을 어렵게 만들 것이라고 – eskhool

관련 문제