6

各著者(外部キーに関連する)の​​最初の本(日付フィールドによる)を含むクエリセットを取得する必要があります...これを行うDjango ORMの方法はありますか(カスタムSQLが優先されますが許容されます)

*編集:Postgresqlのような最新のオープンソースバックエンドのみを使用して機能する回答は受け入れられることに注意してください..純粋なカスタムSQLクエリよりもORMベースのソリューションが優先されます)

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

class Author(Model):
  name = CharField()


Book.objects.filter(??)
4

1 に答える 1

8

PostgreSQL または をサポートする別の DB バックエンドを使用している場合DISTINCT ON、優れた解決策があります。

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

そうでなければ、クエリが 1 つしかない解決策がわかりません。しかし、これを試すことができます:

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)

.values() と .annotate() を組み合わせて、著者ごとにグループ化し、その著者のすべての本の最新の日付に注釈を付けます。しかし、結果は辞書であり、クエリセットではありません。次に、 のような SQL ステートメントを作成しますWHERE author_id=X1 AND date=Y1 OR author_id=X2 AND date=Y2...。2 番目のクエリは簡単です。

于 2013-01-12T12:55:57.887 に答える