Аннотирование подзапроса с методами фильтрации queryset из другой модели через поля Many to Many

Я не уверен, как сделать это возможным, но я надеюсь понять предполагаемый метод, чтобы сделать следующее:

У меня есть простая модель:

class Author(models.Model):
    id = models.TextField(primary_key=True, default=uuid4)
    name = models.TextField()
    main_titles = models.ManyToManyField(
        "Book",
        through="BookMainAuthor",
        related_name="main_authors",
    )

    objects = AuthorManager.from_queryset(AuthorQuerySet)()


class Book(models.Model):
    id = models.TextField(primary_key=True, default=uuid4)
    title = models.TextField()
    genre = models.ForeignKey("Genre", on_delete=models.CASCADE)
    
    objects = BookManager.from_queryset(BookQuerySet)()


class BookQuerySet(QuerySet):
    def by_genre_scifi(self) -> QuerySet:
        return self.filter(**self.LOOKUP_POPULAR_SCIFI)

Я хотел бы добавить новый метод QuerySet для AuthorQuerySet, чтобы аннотировать Author объекты, используя метод из BookQuerySet выше. Я пробовал следующее, что является неправильным:

class AuthorQuerySet(QuerySet):
    def annotate_with_total_titles_by_genres(self) -> QuerySet:
        main_titles_by_genre_sci_fi_query = Book.objects.filter(main_authors__in=[OuterRef('pk')]).all()
            .by_genre_sci_fi()
            .annotate(cnt=Count('*'))
            .values('cnt')[:1]

        return self.annotate(sci_fi_titles_total = 
             Subquery(main_titles_by_genre_sci_fi_query, output_field=IntegerField()))

Предполагаемое использование:

annotated_authors = Author.objects.filter(<some filter>).annotate_with_total_titles_by_genres()

В поиске есть дополнительные поля, не показанные в модели выше, но метод здесь работает, и возвращает BookQuerySet отфильтрованный по поиску:

Book.objects.filter(main_authors__in=['some_author_id']).all().by_genre_sci_fi()

Однако, когда я пытаюсь аннотировать, используя метод AuthorQuerySet, описанный выше, я получаю None для каждой записи.

Вернуться на верх