按 child 值过滤后 children 的数量激增
Number of children explodes after filtering on child value
我有一个 children(排名)的模型(Track)。可以描述(简化)为:
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)
每个轨道的 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)
children 的数量激增至每首歌曲数千首。
有什么想法吗?
加入后可能会多次获得 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))
尝试.annotate(children=Count('rank', distinct=True))
我有一个 children(排名)的模型(Track)。可以描述(简化)为:
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)
每个轨道的 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)
children 的数量激增至每首歌曲数千首。 有什么想法吗?
加入后可能会多次获得 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))
尝试.annotate(children=Count('rank', distinct=True))