【问题标题】:Number of children explodes after filtering on child value过滤子值后,子数爆炸式增长
【发布时间】:2017-12-10 13:21:41
【问题描述】:

我有一个模型(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)

每首曲目的儿童数量激增至数千人。 有什么想法吗?

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    加入您可能会多次获得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))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!但我会接受@jgadelange 的回答。因为他/她是第一个来电者。
      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 2018-08-07
      • 2017-09-27
      • 2020-11-23
      • 1970-01-01
      • 2020-07-01
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多