我有以下模型:
class Journey(models.Model):
time = models.TimeField()
distance = models.FloatField()
class Trip(models.Model):
outward_journey = models.ForeignKey(Journey)
return_journey = models.ForeignKey(Journey, null=True)现在,如果我有一张旅行清单,我想知道所有旅行的总距离。
例如,我想要的是outward_journey距离和inward_journey距离之和。使用Django (使用或不使用.extra()语句)都可以做到这一点。我试过这样的东西:
Trip.objects.all().aggregate(out=Sum('outward_journey__distance'), in=Sum('return_journey_distance'))`这给了我一个字典(我可以用Python值求和),但这并不理想,因为return_journey可能是null (对于单向旅行),因此return_journey_distance可能是None。例如,我可能会得到一个像{'outward_journey_distance' : 500, 'return_journey_distance' : None}这样的字典
我也尝试过:
Trip.objects.all().extra(select={'distance' : 'SUM(outward_journey.distance) + SUM(inward_journey.distance)'})但我得到的是ProgrammingError: missing FROM-clause entry for table "outward_journey"
使用Django ORM完成这类工作最干净的方法是什么?(相对于纯粹的原始SQL)?
编辑:
我的另一个想法是在Python中只获取距离,然后使用下面的内容对它们求和,但正如您所看到的,它并不理想/清晰:
distances = Trip.objects.all().values_list('outward_journey__distance', 'inward_journey__distance')
# gives distances = ((11, 1), (20, None), (2, 2) ...)
total_distance = sum([sum([d for d in each_distance if d]) for each_distance in distances)])发布于 2014-08-21 18:30:59
为此,您可以组合两个查询集;一个用于单向旅行,另一个用于回程,如下所示:
round_trips = Trip.objects.exclude(return_journey__distance__isnull=True).aggregate(outward=Sum('outward_journey__distance'), inward=Sum('return_journey_distance'))
oneway_trips = Trip.objects.filter(return_journey__distance__isnull=True).aggregate(oneway=Sum('outward_journey__distance'))要将两者结合使用,请执行以下操作:
all_distances = dict(round_trips.items() + oneway_trips.items())或者要得到总距离:
total_distance = round_trips.values() + oneway_trips.values()https://stackoverflow.com/questions/25422951
复制相似问题