2017-07-06 7 views
0

子供(ランク)を持つモデル(トラック)があります。このやったとき子供の数がフィルタリングされた後に子どもが爆発する

class Track(models.Model): 
    id = models.CharField('Unique ID', max_length=100, 
    primary_key=True) 
    title = models.CharField('Track title', max_length=100) 
    artist = models.CharField('Artist name', max_length=100) 

class Rank(models.Model): 
    id = models.AutoField(primary_key=True) 
    trackid = models.ForeignKey(Track, related_name='rank') 
    cdate = models.DateField("Date", blank=True, null=True) 

track_list = Track.objects.filter(Q(artist__icontains=query) | 
Q(title__icontains=query)) \ 
.annotate(children=Count('rank')) 

for track in track_list: 
    print(track.children) 

をトラックあたりの子供の数は、すべて(例えば65,78,95)100に接近していると、それが正しいことは、と(簡体字)に記述することができます。

しかし、私はさらに下別のフィルタや必要な注釈を適用することにより、クエリセットを絞り込むとき:

track_list = track_list.distinct() \ 
.filter(rank__cdate__year=filterquery) \ 
.annotate(entrydate=Min('rank__cdate')) \ 
.annotate(children=Count('rank')) 

for track in track_list: 
    print(track.children) 

子どもの数は、トラックあたり数千に爆発します。 アイデア

答えて

2

おそらく参加することによって、Rankモデルを複数回入手することができます。次のようにCountdistinct=Trueを追加してみてください:

track_list = track_list.distinct() \ 
    .filter(rank__cdate__year=filterquery) \ 
    .annotate(entrydate=Min('rank__cdate')) \ 
    .annotate(children=Count('rank', distinct=True)) 
+0

ありがとうをお試しください!魅力のように動作します –

0

.annotate(children=Count('rank', distinct=True))

+0

Thanx!しかし、私は@ jgadelangeの答えを受け入れるつもりです。彼/彼女は最初の呼び出し元だったので。 –

関連する問題