过滤子值后,子项数会爆炸

时间:2017-07-06 13:35:57

标签: django django-queryset django-orm

我有一个带孩子的模特(Track)(Rank)。这可以描述(简化)为:

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 个答案:

答案 0 :(得分:2)

加入你可能需要多次获得Rank个模型。尝试将distinct=True添加到Count,如下所示:

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

答案 1 :(得分:0)

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