首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django在外键上的聚合和

Django在外键上的聚合和
EN

Stack Overflow用户
提问于 2014-08-21 17:36:34
回答 1查看 589关注 0票数 0

我有以下模型:

代码语言:javascript
复制
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()语句)都可以做到这一点。我试过这样的东西:

代码语言:javascript
复制
 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}这样的字典

我也尝试过:

代码语言:javascript
复制
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中只获取距离,然后使用下面的内容对它们求和,但正如您所看到的,它并不理想/清晰:

代码语言:javascript
复制
 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)])
EN

回答 1

Stack Overflow用户

发布于 2014-08-21 18:30:59

为此,您可以组合两个查询集;一个用于单向旅行,另一个用于回程,如下所示:

代码语言:javascript
复制
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'))

要将两者结合使用,请执行以下操作:

代码语言:javascript
复制
all_distances = dict(round_trips.items() + oneway_trips.items())

或者要得到总距离:

代码语言:javascript
复制
total_distance = round_trips.values() + oneway_trips.values()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25422951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档