Запрос для GroupBy в Django

class Author(models.Model):
    first_name = models.CharField(max_length=10)
    last_name = models.CharField(max_length=10, null=True, blank=True)
    
    def __str__(self):
        return f'{self.first_name} {self.last_name}'
    

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.ManyToManyField(Author, related_name='book_author')
    price = models.SmallIntegerField()
    
    def __str__(self):
        return self.name

Здравствуйте! Я пытался сгруппировать стоимость книг в приведенной выше модели по автору (так как для одной книги может быть несколько авторов). Я знаю, что это можно сделать с помощью groupby, но я не знаю, как запросить это в Django ORM, я пробовал искать в интернете, но не нашел подходящего решения.

Я пытаюсь сделать следующее, например, если у книги 'Wonder' есть два автора 'A' и 'B', и они написали вместе другие книги, например, 'Wonder' от 'A' и 'B' и 'New' by 'A' and 'B'

Итак, я хочу запросить книги с комбинацией их авторов + поле общей стоимости всех книг, написанных авторами (комбинация авторов "многие-ко-многим").

Если есть способ, пожалуйста, помогите и извините за плохой английский.

Это включает в себя небольшое кодирование и обходной путь.

Рассмотрите экземпляр main_book, над которым вы хотите работать (предположим, это книга Wonder). Позже, получите всех авторов книги, как показано ниже

authors = set(main_book.author.all())

Позже отфильтруйте все книги, в которых есть этот набор authors вот так,

books = Book.objects.filter(author__in=authors)

Тогда вот вам точная логика,

total_cost = 0
for book in books:
    if authors == set(book.author.all()):
        total_cost += book.price
print(total_cost)

Это должно вернуть вам стоимость всех книг, которые имеют одинаковые authors имеют main_book. Помните, как вы говорили в комментариях и вопросах, учитываются только те книги, в которых присутствует одинаковый набор авторов, не больше, не меньше.

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