Запрос для 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
.
Помните, как вы говорили в комментариях и вопросах, учитываются только те книги, в которых присутствует одинаковый набор авторов, не больше, не меньше.