Есть учебная база данных из 3 таблиц. Страна, клубы и фанаты клубов.
class Country(models.Model):
title = models.CharField(max_length=20)
strength = models.IntegerField('Численность')
def __str__(self):
return self.title
class Club(models.Model):
title = models.CharField(max_length=20)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Fun(models.Model):
name = models.CharField(max_length=15)
club = models.ForeignKey(Club, on_delete=models.CASCADE)
def __str__(self):
return self.name
Необходимо составить queryset из экземпляров модели Country, аннотированные количеством club с количеством fun больше n.
Если опустить требование составить queryset, то получается решить вот таким запросом:
Club.objects.annotate(c=Count('fun')).filter(c__gt=<n>).annotate(total=Count('title', distinct=True)).values('country__title', 'total')
Если пытаться зайти все таки с получением queryset, то придумал только вот такую кашу:
делаем подзапрос:
sub = Club.objects.filter(country=OuterRef('pk')).annotate(c=Count('fun')).filter(c__gt=<n>).annotate(total=Count('title', distinct=True)).values('total')
Вставляем в основной запрос
x = Country.objects.annotate(result=Subquery(sub[:1]))
Вроде работает. Можно ли как то проще это реализовать? Без Subquery.