Нарезка условного подзапроса 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)