2017-04-24 7 views
2

関連するmanytomany要素の数に応じてランク付けしたい要素のリストがあります。私はそれらのソース要素の数を集計するのが正しい方法だと思うが、私はまだ解決策を見つけていない。Django:1つのクエリで数を集計します。

class Element(models.Model): 
    Source1 = models.ManyToManyField(Source1) 
    Source2 = models.ManyToManyField(Source2) 
    Source3 = models.ManyToManyField(Source3) 


Ranked = (Element.objects.all().aggregate(
     Ranked=Sum(F('Source1') + F('Source2') + F('Source3'), output_field=IntegerField)['Ranked'] 
)) 

答えて

1

一つの可能​​な解決策:

agg_data = Element.objects.aggregate(total_source1=Count('Source1'), total_source2=Count('Source2'), total_source3=Count('Source3')) 
total_count = sum(agg_data.values()) # this is value which you need 

更新: あなたは要素のリストを取得したい場合:

res = Element.objects.all().annotate(total_source1=Count('Source1'), total_source2=Count('Source2'), total_source3=Count('Source3')) 
.annotate(total_count=F('total_source1') + F('total_source2') + F('total_source3')).order_by('-total_count') 
+0

は、ご返信いただきありがとうございます。これは私にソースの合計を与えますが、ソースの量によってソートされたすべての要素のリストはありません。 – merlinschumacher

+0

私は答えを編集しました – ittus

+0

それは動作しますが、私はこれに短縮しました: 'ランキングリンク= Link.objects.annotate(ランキング=( 'RssEntries')+カウント( 'ツイート')+カウント( 'RedditPosts') ).order_by( ' - ranking')。all() ' ありがとう! – merlinschumacher

関連する問題