gpt4 book ai didi

django - 在反向关系上具有多个 Sum 聚合的不同值

转载 作者:行者123 更新时间:2023-12-04 02:04:06 24 4
gpt4 key购买 nike

根据Django docs将多个聚合与 annotate() 结合起来会产生错误的结果,因为使用的是连接而不是子查询。他们还注意到,Count 有一个独特的参数可能会有所帮助。

Sum 有类似的东西吗?在这个精简的示例中,我得到了错误的结果。生成的 amount 值对于大多数项目来说都太高了。

qs = Client.filter('project__date__year=2017').annotate(
isum=Sum('project__intoffer__amount', distinct=True),
esum=Sum('project__extoffer__amount', distinct=True)
)

distinct=True 参数没有任何区别。

简化的 models.py:

class Client(models.Model):
title = models.CharField('Title', max_length=50)

class Project(models.Model):
title = models.CharField('Title', max_length=100)
client = models.ForeignKey('Client', verbose_name='Client')
date = models.DateField('Date', blank=True, null=True)

class IntOffer(models.Model):
project = models.ForeignKey(Project, verbose_name='Project')
amount = models.DecimalField('Amount', max_digits=19, decimal_places=2)

class ExtOffer(models.Model):
project = models.ForeignKey(Project, verbose_name='Project')
amount = models.DecimalField('Amount', max_digits=19, decimal_places=2)

最佳答案

你可以尝试使用django Subquery expression .在您的情况下,您的查询如下所示:

from django.db.models import Sum, OuterRef, Subquery

qs = Client.filter('project__date__year=2017').annotate(
isum=Subquery(Project.objects.filter(client=OuterRef('pk')).values('client_id').annotate(sum=Sum('intoffer__amount')).values('sum')[:1]),
esum=Subquery(Project.objects.filter(client=OuterRef('pk')).values('client_id').annotate(sum=Sum('extoffer__amount')).values('sum')[:1])
)

请注意,在大型表上它可能会很慢,在这种情况下使用 RawSQL 可能更好。

关于django - 在反向关系上具有多个 Sum 聚合的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906782/

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