Django 聚合:类别中的最高总和

Django Aggregation: highest sum in categories

伙计们

我想知道如何获得一个类别的最高总和。

所以我有一个包含类别的模型和一个包含成本类别的成本模型。

我的models.py

from django.db import models

class CostCat(models.Model):
    name = models.CharField(max_length=50, default=None, null=True, blank=True)


class Cost(models.Model):
    name = models.CharField(max_length=50, default=None, null=True, blank=True)
    cost_category = models.ForeignKey(CostCat, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=12, decimal_places=2,null=True, blank=True)

结果应该是我可以显示成本总和最高的类别。

我已经坚持了好几个小时了。我得到的最接近的是我的测试,如下所示。

我可以打印出所有总和及其各自的类别,但现在我需要了解如何获取类别和最高总和的值。我现在真的处于螺旋式上升状态。

views.py

def metrics(request):

    tests = CostCat.objects.annotate(sum=Sum('cost__amount'))

    for test in tests:

        print(test, test.sum)

    return render(request, 'metrics.html', "topcostcat":test, "topcostcatsum":test.sum )


如果你能帮我出出主意,我将不胜感激!

提前致谢

您可以按成本排序,获得最后一个,所以:

def metrics(request):
    topcat = CostCat.objects.annotate(sum=Sum('cost__amount'))<strong>.latest('sum')</strong>
    return render(request, 'metrics.html', {'topcat': topcat})

或者如果可能存在没有 Cost 的类别,您可以使用 nulls_last=True [Django-doc]:

from django.db.models import F

def metrics(request):
    topcat = CostCat.objects.annotate(sum=Sum('cost__amount'))<strong>.earliest(
        F('sum').desc(nulls_last=True)
    )</strong>
    return render(request, 'metrics.html', {'topcat': topcat})