2013-01-09 18 views
6

各著者(外部キーに関連する)の​​最初の本(日付フィールドによる)を持つクエリセットを取得する必要があります... Django ORMがありますこれを行う方法(カスタム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 EDIT 2のセクションで私の現在のハックです。 –

+0

さて、私はPostgreSQLを使っていますので、私は別名に限定されていません...私はあなたの質問に基づいて私の答えを見つけることができるかどうかわかりません...ポインタのためにありがとう – eskhool

答えて

6

素敵なソリューションがあります:

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

それ以外の場合は、1つのクエリのみの解決策はわかりません。著者.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文を作成します。今すぐ2番目のクエリは簡単です。

+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

関連する問題