我想要两个对象之间的增量:
class Point(models.Model):
measurement = models.ForeignKey(Measurement)
time = models.DateTimeField()
value = models.FloatField()
def delta(self):
measurement = self.measurement.point_set.order_by('time')
measurement = measurement[-2]
return self.value - measurement.value
但这显然只适用于最新的对象。有没有办法在时间意义上获得self.object的前辈?
答案 0 :(得分:1)
def delta(self):
try:
my_predecessor = self.objects\
.filter(measurement_id=self.measurement_id, pk__lt=self.pk)\
.order_by('pk')[-1]
except IndexError:
# there is no previous object
return None
else:
return self.time - my_predecessor.time
self.measurement_id
应与self.measurement.pk
pk
表示主键。这些值通常是从序列中自动分配的。
pk__lt=self.pk
表示“pk L ess T han mine”或“早于我创建”的对象。更多here。
我order_by('pk')
,所以我确保按照创建顺序选择Point
个对象(比较整数字段总是比比较DateTimeField
个对象。您总是可以用{{order_by('time')
替换它。 1}}如果你有疑惑:)
_id
被描述为here。我用它来构建一个更优的SQL查询,它只从一个表中选择(不加入Measurement
模型的表)。 _id
和__id
之间的difference。
最后,[-1]
获取最后一个对象。 Django queryset slicing与python slicing非常相似。