2

次のモデルを検討してください。

    class Data(Model):
        created_at = models.DateTimeField()
        category = models.CharField(max_length=7)

すべてのカテゴリで最新のオブジェクトを選択したい。

この質問に続いて、個別のカテゴリを選択し、それぞれに対して個別のクエリを作成しています。

    categories = Data.objects.distinct('category').values_list('category', flat=True)
    for category in categories:
        latest_obj = Data.objects.filter(category=category).latest('created_at')

このアプローチの欠点は、多数のクエリが作成されることです (個別のカテゴリに対して 1 つ、次にカテゴリごとに個別のクエリ)。

単一のクエリでこれを行う方法はありますか?

4

1 に答える 1

0

通常、リレーショナル データベースでは group by を使用します。Django には集約 API (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregation) があり、次のことが可能です。

from django.db.models import Max
Data.objects.values('category').annotate(latest=Max('created_at'))

これは単一のクエリを実行し、次のようなリストを返します。

[{'category' : 'cat1', 'latest' : '01/01/01' },{'category' : 'cat2' 'latest' : '02/02/02' }]

しかし、このリスト内でデータ レコード ID も取得したいと思うかもしれません。この場合、Django は単純に考えることはしません。問題は、django が value 句のすべてのフィールドを使用してグループ化を行い、クエリから余分な列を返すことができないことです。

編集:私は当初、Web リソースに基づいてクエリの最後に 2 番目の values() 句を追加することを提案しましたが、これは結果セットに余分な列を追加しません。

于 2012-11-18T15:05:17.010 に答える