Я пишу один метод в Django Модель менеджера. Я хочу написать метод, который определяет количество проданных копий (книг) на автора.
У меня есть две модели и метод, написанный на Менеджер . Моя проблема в том, что метод также должен быть цепным из любого набора запросов Author, например, что-то вроде
Author.objects.filter(...).exlucde(...).total_copies_sold()
также должно работать.
Пример:
author = Author.objects.create(...)
Book.objects.create(..., author=author, copies_sold=10)
Book.objects.create(..., author=author, copies_sold=20)
author_total_books = Author.objects.total_copies_sold().first()
>>> author_total_books.copies
30
Ниже моего код. Это работает как в примере выше, но затем я пытаюсь что-то вроде:
author_books = Author.objects.filter(id=2).total_copies_sold()
Я получил
У объекта 'QuerySet' нет атрибута 'annotate'
class AuthorManager(models.Manager):
def total_copies_sold(self):
return self.get_queryset().annotate(copies=Sum('book__copies_sold')
class Author(models.Model):
first_name = models.CharField(max_length=120)
last_name = models.CharField(max_length=120)
objects = AuthorManager()
class Book(models.Model):
title = models.CharField(max_length=120)
copies_sold = models.PositiveIntegerField()
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
[Отредактировано]
Спасибо, Шиллингт, за ответ. Я добавил:
class AuthorQueryset(models.QuerySet):
def total_copies_sold(self):
return self.annotate(copies=Sum('books__copies_sold'))
Я попробовал что-то вроде:
author_books = Author.objects.filter(id=2).total_copies_sold()
>>> author_books.copies
Я получил
Объект AuthorQueryset не имеет атрибута "копии"