django - 是否有另一种方法来注释现有查询集中的计数/总和?
问题描述
让我用规范模型 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 原则相矛盾。
是否还有更简洁的方法可以在一个函数中获取查询集并在另一个函数中对其进行注释?
解决方案
推荐阅读
- ajax - 选择文件时如何使用 rich:fileUpload 添加额外的表单数据参数或 URL 查询参数?
- javascript - 如何获取对象内数组的第一个元素
- r - 列中年龄数据的百分比
- certificate - 如何检查数字签名令牌是否具有签名和加密功能
- php - 在 Yii2 php 中,如何在不重新加载页面或手动关闭的情况下删除错误闪烁消息?
- flutter - 如何在 Navigator 2.0 中订阅 Route 更改
- typescript - 如何使用另一个对象的成员创建一个新对象,不包括某些接口/类型中的成员?
- python - 使用 Plotly Express 更改线条颜色
- javascript - 根据列值动态更改图标
- ios - 当应用程序在 iOS 中终止时发送一个信号标签