【发布时间】:2020-06-18 10:08:26
【问题描述】:
我有 3 个模型,例如:
class Customer(models.Model):
hobby_groups=models.ManyToManyField(
'HobbyGroup',
blank=True,
related_name='group_customers',
)
class HobbyGroup(models.Model):
hobbies = models.ManyToManyField(
'Hobby',
blank=True,
related_name='hobby_groups',
)
class Hobby(models.Model):
title = models.CharField(max_length=255, default='football')
我需要计算每个客户的爱好数量。
qs = Customer.objects.annotate(
hobbies_count=Count('hobby_groups__hobbies', distinct=True)
)
使用 distinct 可以正常工作,但速度很慢。
我尝试过使用子查询。
hobbies = Hobby.objects.filter(hobby_groups__group_customers=OuterRef('pk')).values('pk')
hobbies_count = hobbies.annotate(count=Count('*')).values('count')
qs = Customer.objects.annotate(
hobbies_count=Subquery(hobbies_count)
)
但它返回异常“用作表达式的子查询返回的不止一行”
有什么方法可以更快地计算或修复第二个解决方案?因为我对向后相关的模型做了类似的事情,而且效果很好而且很快。
提前感谢您的帮助。
【问题讨论】:
标签: django count subquery annotate m2m