Аннотирование подзапроса с методами фильтрации 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
для каждой записи.