@kvarel

Как составить запрос из 3 таблиц в Django ORM?

Есть учебная база данных из 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.
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы