让我说明规范模型Book&Author的问题:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
name = models.CharField(max_length=300)
price = models.DecimalField(max_digits=10, decimal_places=2)
authors = models.ManyToManyField(Author)
status = models.CharField(max_length=50)
date = models.DateField()
department = models.CharField(max_length=100)
这是视图:
class Report(ListView):
...
def get_queryset(self):
... # calculating of filters
return Book.objects.filter(status='published', date= ... a bunch of filters)
这样我们就有了一个包含所有必需过滤器的查询集。可能会在其他功能中使用它,例如,获取书籍数量:
def books_number(self):
qs = self.get_queryset()
return qs.count()
或所有这些书的费用:
def summa(self):
qs = self.get_queryset()
return qs.aggregate(Sum('price'))
现在,我想获取每个作者的书籍数量及其费用,我会对这样的事情感到满意:
def authors_info(self):
qs = self.get_queryset()
return Author.objects.annotate(books_number=Count( use qs somehow ... ),
books_cost = Sum( use qs over field 'price' somehow ...)
)
但是我还没有找到一种方法。
好吧,要使其正常工作,我使用了以下方法:
def authors_info(self):
... # calculating of THE SAME filters AGAIN
q_ = Q(status='published', date= ... a bunch of filters)
count_ = Count('book', filter=q_)
sum_ = Sum('book__price', filter=q_)
return Author.objects.annotate(books_number=count_,
books_cost=sum_)
但这绝对与DRY原理相矛盾。
在一个函数中获取查询集并在另一个函数中对其进行注释是否还有其他更整洁的方法?