将 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
的总和。
我正在尝试对我的一些 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
的总和。