2

「views」と「votes」という2つの整数フィールドを持つ「Story」というモデルがあります。すべてのStoryオブジェクトを取得するときに、返されたQuerySetに、単に「ビュー」/「投票」である「ランキング」フィールドで注釈を付けたいと思います。次に、QuerySetを「ランキング」で並べ替えたいと思います。の線に沿った何か...

Story.objects.annotate( ranking=CalcRanking('views','votes') ).sort_by(ranking)

Djangoでこれを行うにはどうすればよいですか?または、PythonでQuerySetが取得された後に実行する必要がありますか(QuerySet内の各オブジェクトのランキングを含むリストを作成するなど)?

ありがとう!

PS:私の実際のプログラムでは、ランキングの計算は上記のように単純ではなく、最初のQuerySetの他のフィルターに依存しているため、ストーリーモデルの別のフィールドとして保存することはできません。

4

1 に答える 1

1

Djangoでは、渡すことができるものannotate(およびaggregate)はのサブクラスである必要がありますdjango.db.models.aggregates.Aggregate。集約/アノテーションは実際にはデータベース内で行われるため、任意のPythonオブジェクトを渡すことはできません(これがとの要点ですaggregateannotate。カスタム集計の記述はDjangoではサポートされていないことに注意してください(そのためのドキュメントはありません)。利用可能なすべての情報は、この最小限のソースコードです:https ://code.djangoproject.com/browser/django/trunk/django/db/models/aggregates.py

つまり、計算を何らかの方法でデータベースに保存するか、集計APIがどのように機能するかを理解するか、raw sql(rawManagerのメソッド)を使用して実行する必要があります。

于 2011-11-17T14:23:28.220 に答える