0

私のジャンゴアプリには「ドキュメント」があります。各ドキュメントには、作成日順に並べられた 1 つ以上の「リビジョン」があります。すべてのドキュメントの最新のリビジョンを取得する方法が必要です。私がこれまでに持っている最高のものは以下のコードですが、より少ないデータベースクエリでこれを行う方法があるに違いないと思いますか?

def get_document_templates():
    result = []
    for d in Document.objects.filter(is_template=True).all():
        result.append(d.documentrevision_set.latest())
    return result

「注釈」および「集計」フィルターを調査してきましたが、これをより効率的に行う方法がわかりません。データベースのバックエンドは近い将来変更される可能性があるため、未加工の SQL で手を汚したくありません。誰にもアイデアはありますか?

ありがとう!!

4

2 に答える 2

1

2つのアプローチがあると思います。1 つは、このブログ投稿「関連アイテムを集計で取得する」について説明しました。これDocumentにより、それぞれに「リビジョン」が添付されます (両方にアクセスする必要がある場合)。

のみが必要な場合Revisionは、メソッドを使用してみてくださいvalues()。集計で使用すると、機能が微妙に変わります。

filter() 句と同様に、 annotate() および values() 句がクエリに適用される順序は重要です。values() 句が annotate() の前にある場合、注釈は values() 句で記述されたグループ化を使用して計算されます。

ただし、annotate() 句が values() 句の前にある場合、注釈はクエリ セット全体に対して生成されます。この場合、values() 句は、出力で生成されるフィールドのみを制約します。

Revisionしたがって、 byのグループ化Documentと集計を行うことができますdate

Revision.objects.all().values('document').aggregate(Max('date'))
于 2013-08-15T09:59:54.507 に答える
-1

次のようなモデルから最新の 9 つのデータを取得できます。

Model.objects.all().order_by('-date')[0:9]
于 2013-08-15T09:36:59.333 に答える