Joh*_*str 12 django django-orm
我正在尝试执行django聚合函数,但无法产生所需的结果.
我得到了什么:
income_posts.values_list('category__name','amount')
[(u'Donation', Decimal("2000.00")), (u'Paycheck', Decimal("1200.00")), (u'Donation', Decimal("1000.00"))]
Run Code Online (Sandbox Code Playgroud)
期望的结果:
[(u'Donation', Decimal("3000.00")), (u'Paycheck', Decimal("1200.00))]
Run Code Online (Sandbox Code Playgroud)
我需要对具有相同category__name的'amount'字段求和.
Jor*_*ter 19
from django.db.models import Sum
income_posts.values('category__name').order_by('category__name').annotate(total=Sum('amount'))
Run Code Online (Sandbox Code Playgroud)
NKS*_*KSM 10
这是此错误的票证。
我们可以使用Subquery(Django Docs)来实现这个问题:
from django.db.models import Subquery, OuterRef, IntegerField, Sum, Value, Count
MyModel.objects.annotate(
count_model_a=Count('ModelA', distinct=True),
sum_model_b=Coalesce(
Subquery(
ModelB.objects.filter(
MyModel=OuterRef('pk')
).values('MyModel_id').annotate(
my_sum=Sum('MyModel_Field')
).values('my_sum')[:1],
output_field=IntegerField()
),
Value(0)
)
).values("count_model_a", "sum_model_b")
Run Code Online (Sandbox Code Playgroud)
我还使用Coalesce(Django Docs)函数来防止返回None。
上面的代码将对数据库运行一个查询。
只是为了增加arjun27的答案。由于该软件包似乎已被放弃,您可能只想复制其中需要的3行:
from django.db.models import Sum
class DistinctSum(Sum):
function = "SUM"
template = "%(function)s(DISTINCT %(expressions)s)"
Run Code Online (Sandbox Code Playgroud)
可以和上面一样使用:
income_posts.annotate(total=DistinctSum('amount')
Run Code Online (Sandbox Code Playgroud)
小智 5
Django 3.0 在 Sum 和 Avg 上引入了“distinct=True”:https : //docs.djangoproject.com/en/3.0/ref/models/querysets/#sum
| 归档时间: |
|
| 查看次数: |
15373 次 |
| 最近记录: |