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})
伙计们
我想知道如何获得一个类别的最高总和。
所以我有一个包含类别的模型和一个包含成本类别的成本模型。
我的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})