gpt4 book ai didi

带有聚合的Django子查询

转载 作者:行者123 更新时间:2023-12-03 13:43:15 28 4
gpt4 key购买 nike

我有两个名为UserTransaction的模型。在这里,我想让所有用户获得状态为成功的交易金额的总和。

我已经尝试过使用子查询,但是我没有得到如何用条件注释子查询的集合

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软件包使此操作变得更加容易。

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,因为这会立即评估子查询。相反,您必须注释该值。您还必须按外部ref值进行分组,否则,您将仅独立注释每个事务。
    subquery = Transaction.objects.filter(
    status='success', user=OuterRef('pk')
    ).values(
    'user__pk'
    ).annotate(
    total_spend=Sum('amount')
    ).values(
    'total_spend'
    )

    第一个 .values导致正确的分组依据。第二个 .values导致选择所需的一个值。

    关于带有聚合的Django子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55925437/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com