Нарезка условного подзапроса Django с другим значением подзапроса

Я ищу способ условно нарезать результат подзапроса на основе значения другого подзапроса. Допустим, у меня есть модели Автор и Книги:

class Author(models.Model): 
name = models.CharField(max_length=100)
birthday= ...

class Book(models.Model):
author: models.ForeignKey('Author')
title: models.CharField(max_length=100)
copies_sold: models.CharField(max_length=50)
publish_date: ....

Теперь вот что я хочу запросить:

1.Все книги автора 2.Самые продаваемые n книг из всех книг автора (допустим для этого примера, если у автора меньше 3 книг, возвращаются все книги, если у автора от 3 до 6 книг, возвращаются n-1 самых продаваемых книг, если больше 10, возвращаются 6 самых продаваемых книг, точная логика здесь не имеет значения, она просто должна быть способна различать случаи, сколько книг у автора

).

Я попробовал это без условных случаев со следующим подходом:

books = Books.objects.all()

best_n_books_qobj = Q()
all_books_by_author_qobj = Q()

books_by_author_subquery = Books.objects.filter(author_id=OuterRef('id'))
              .order_by('copies_sold').values('id').annotate(books_count=Count('*'))


best_n_books_qobj.add(Q(id__in=Subquery(books_by_author_subquery.values('id')[:Subquery(books_by_author_subquery.values('books_count'), output_field=IntegerField())])), Q.OR)

all_books_by_author_qobj.add(Q(id__in=Subquery(books_by_author_subquery.values('id'))), Q.OR)

best_n_books_by_author = books.filter(best_n_books_qobj)
all_books_by_author = books.filter(all_books_by_author_qobj)

Теперь это не удается:

TypeError: '>=' not supported between instances of 'Subquery' and 'int'

Это имеет смысл, поскольку подзапрос не может быть оценен сам по себе перед всем запросом. С жестко заданным значением это, конечно, работает. Например, дайте мне всегда 3 самые продаваемые книги с [:3]

Итак, как я могу достичь этого, чтобы условно нарезать список книг, которые я хочу считать лучшими n продаваемыми книгами автора? Есть ли другие методы, которые я упускаю? Наконец, я хочу сделать срез с помощью [:case(how_many_books_does_an_author_have-n)

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