【发布时间】:2015-09-03 09:14:51
【问题描述】:
我有一个模型TimeTrial,它聚合了Legs 的有序列表。
class TimeTrial(models.Model):
objects = TimeTrialManager()
class Leg(models.Model):
timetrial = models.ForeignKey(TimeTrial)
duration = models.FloatField()
order = models.PositiveIntegerField(default=0)
@property
def duration_prefix_sum(self):
qs = Leg.objects.filter(timetrial=self.timetrial,
order__lte=self.order)
return qs.aggregate(Sum('duration'))
class TimeTrialManager(models.Manager):
def get_queryset(self):
qs = super(TimeTrialManager, self).get_queryset()
qs = qs.annotate(leg_count=Count('leg'))
qs = qs.annotate(duration=Sum('leg__duration'))
return qs
(the actual models 的精简版。)
TimeTrialManager 用Legs 的数量和Leg.duration 的总和来注释每个TimeTrial。我想以类似的方式使用Django的annotate/aggregate计算duration_prefix_sum,所以当我在timetrial.leg_set.all()中显示每条腿的duration_prefix_sum时不会导致数据库命中。
我知道我可以编写 Python 代码来计算它:
timetrial.leg_set_annotated = []
s = 0
for l in timetrial.leg_set.all():
s += l.duration
l.duration_prefix_sum_computed = s
timetrial.leg_set_annotated.append(l)
但我宁愿使用 Django 的 annotate/aggregate/Case/When。
【问题讨论】: