2017-07-06 92 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) 

每個磁道的兒童的人數都接近100(如65,78,95),這是正確的。

但是,當我縮小查詢集進一步向下通過應用另一個過濾器和一個需要註解:

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模型。嘗試添加distinct=TrueCount如下:

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的答案。由於他/她是第一個來電者。 –