将 Django 中的列与相关字段相加

Summing columns in Django with related fields

我正在尝试对我的一些 Django 列进行一些聚合,但我遇到了一个我无法弄清楚的错误。这是我的模型(无论如何都是相关的东西):

class Fillup(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    date = models.DateField(default=date.today)
    trip_distance = models.FloatField(validators=[MinValueValidator(0.0)])
    car = models.ForeignKey('Car',on_delete=models.CASCADE, related_name='fillups')


class Car(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    name = models.CharField(max_length=25)

所以每个 Fillup 对象本质上是汽车中的一个油箱,我想要做的是获取每辆汽车的 trip_distance 列的总数。我尝试了其他各种 Whosebug 页面上的一些东西,但似乎没有任何效果。

我的第一次尝试是将此字段添加到汽车模型中:

@property
def distance_driven(self):
    return self.fillups.aggregate(sum('trip__distance'))

但是我得到以下错误:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

我也试过将它添加到我的序列化程序中,但得到了同样的错误:

distance_driven = serializers.SerializerMethodField()

def get_distance_driven(self, ob):
    return ob.fillups.all().aggregate(sum('trip_distance'))['trip__distance']

我在这里遗漏了什么吗?我不明白为什么在尝试对 FloatField 列求和时出现该错误。

如有任何帮助,我们将不胜感激!

为了聚合,您使用 Sum object [Django-doc], not the Python builtin sum

您可以通过以下方式获取单个对象的总和:

from django.db.models import <strong>Sum</strong>

return self.fillups.aggregate(total=<strong>Sum(</strong>'trip_distance'<strong>)</strong>)['total']

如果您必须对多条记录执行此操作,最好 .annotate(…) [Django-doc]:

from django.db.models import <strong>Sum</strong>

Car.objects.annotate(
    total_distance=<b>Sum('fillups__trip_distance')</b>
)

从该查询集产生的 Car 对象将有一个额外的属性 .total_distance 以及相关 Fillup trip_distance 的总和。