我有两个模型叫User
and Transaction
。这里我想获取状态为成功的所有用户的交易金额总和。
我尝试过使用子查询,但我不知道如何用条件注释子查询的聚合
class User(models.Model):
name = models.CharField(max_length=128)
class Transaction(models.Model):
user = models.ForeignKey(User)
status = models.CharField(choices=(("success", "Success"),("failed", "Failed")))
amount = models.DecimalField(max_digits=10, decimal_places=2)
subquery = Transaction.objects.filter(status="success", user=OuterRef('pk')).aggregate(total_spent = Coalesce(Sum('amount'), 0))
query = User.objects.annotate(total_spent=Subquery(subquery:how to do here ?)).order_by(how to order here by total_spent)
这变得容易得多django-sql-utils https://github.com/martsberger/django-sql-utils包裹。
from django.db.models import Sum,
from sql_util.utils import SubqueryAggregate
User.objects.annotate(
total_spend=SubqueryAggregate('transaction__amount',
filter=Q(status='success'),
aggregate=Sum)
)
如果你想长期完成它(没有 django-sql-utils),你需要了解关于子查询的这两件事:
在使用之前无法对其进行评估
它只能返回具有单个列的单个记录
所以,你不能打电话aggregate
在子查询上,因为这会立即计算子查询。相反,您必须注释该值。您还必须按外部引用值进行分组,否则您将仅独立注释每个事务。
subquery = Transaction.objects.filter(
status='success', user=OuterRef('pk')
).values(
'user__pk'
).annotate(
total_spend=Sum('amount')
).values(
'total_spend'
)
首先.values
导致正确的分组依据。第二.values
导致选择您想要的一个值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)