【问题标题】:Custom aggregate annotation in DjangoDjango中的自定义聚合注释
【发布时间】:2015-01-08 16:06:31
【问题描述】:

我有很多组,每个组都有一个修订版,每个修订版都有几个月。

我想输出带有注释的所有组对象。

对于每个组,它应该只选择最新版本,然后总结所有月份。

我不确定它是否可以在 Django 中完成。我尝试了类似的东西

Group.objects.annotate(
    month_sum=Revision.objects.filter(date__lte=my_date).latest('date').aggregate(Sum('months__amount'))
)

并希望得到一个包含所有组的查询集,每个组都有一个总和month_sum

【问题讨论】:

    标签: python django django-models django-views django-queryset


    【解决方案1】:

    你能试试这个吗:

    qs = Group.objects.filter(revision__date__lte=my_date).annotate(month_sum=Sum('months__amount'))
    

    您可以通过在 shell 中打印生成的数据库查询来调试并尝试理解如何进行正确的查询:

    print str(qs.query)
    

    编辑:

    为了显示旧版本的群组,我认为django-aggregate-if 可能会对您有所帮助

    运行pip install django-aggregate-if

    from django.db.models import Q
    from aggregate_if import Sum
    
    revision = Revision.objects.filter(revision__date__lte=my_date).latest()
    qs = Group.objects.all().annotate(month_sum=Sum('months__amount', only=Q(revision=revision)))
    

    【讨论】:

    • 太棒了。问题是我只想要最新版本而不是所有版本,所以我需要做类似filter(revision_date_lte=my_date).latest()
    • 我想我已经很接近让它工作了。它似乎有效,但仅适用于一组。我想这是因为每个组都有一些估计,每个估计都有一些修订。使用您的示例,它将过滤每个组中的相同修订。我真的不知道如何解决它,但我感谢你的帮助! django-aggregate-if 应该在 Django 中实现:-D
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2017-08-17
    • 2011-07-07
    • 2020-05-23
    • 1970-01-01
    • 2023-03-29
    • 2017-07-21
    相关资源
    最近更新 更多