У меня есть 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)
)
При отличном он работает нормально, но очень медленно.
Я пытался использовать подзапрос.
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)
)
Но он возвращает исключение 'Более одной строки, возвращенной подзапросом, использованным в качестве выражения'
Есть ли способ посчитать это быстрее или исправить второе решение? Потому что я делал то же самое для отсталых моделей, и все работало нормально и быстро.
Заранее спасибо за помощь.