私はdjango-eztablesを使用してデータテーブルのサーバー側処理を行っており、集計に関連するいくつかのフィールドを追加したいと考えています (ここで説明したように)
以下はそれぞれ個別に正常に動作します。
def get_queryset(self):
qs = super(SomeObjectDataTableView, self).get_queryset()
return qs.select_related().annotate(items_count=Count('items'))
と
def get_queryset(self):
qs = super(SomeObjectDataTableView, self).get_queryset()
return qs.select_related().annotate(total_sum=Sum('anotherobject__differentobject__total'))
annotate()
しかし、どちらの順序でも、同じように、または次々に連鎖して両方を実行しようとすると、両方とも同じ数になります。これは、それぞれがどうあるべきかの結果です。
Countに追加distinct=True
すると、正しい値が生成されますが、それでも Sum は膨張した値になります。(繰り返しますが、順序を変更しても役に立ちません。また、Sum はdistinct
パラメーターを取りません) 。
SO で同様の質問をいくつか見たことがありますが、ほとんどは複数のカウントを扱っているようで、 を使用して解決できますdistinct=True
。サムを持っていたものもありましたが、解決策にはextra()
手作りの SQL を使用する必要があり、これまでのところ、必要なすべての外部キートラバーサルを処理するために適応させることができませんでした (SQL を少し使用しましたが、私は決して専門家ではありません)。extra()
唯一の実行可能な解決策である場合に備えて、関連するモデルの基本的なセットアップを次に示します。
- アイテムには SomeObject への外部キーがあります
- AnotherObject には、DifferentObject への外部キーと SomeObject への外部キーがあります
これらの問題を回避し、クエリセットで両方の注釈を取得する方法を知っている人がいれば、大歓迎です。