2016-11-04 52 views
0

之前创建的对象我想两个物体之间的增量:获得在该对象

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的前辈?

回答

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是大号 ESS 牛逼邯矿”或“早于我创造”。更多here

order_by('pk'),所以我确保创建它们的顺序选择Point对象(比较整型字段总是比比较DateTimeField对象更快。您可以随时与order_by('time')取代它,如果你将有一些疑虑:)

_id被描述为here。我用它来构建一个更优化的SQL查询,只从一个表中选择(不加入Measurement模型的表)。 _id__id之间的difference

最后,[-1]取最后一个对象。 Django queryset slicing的作用非常类似于python slicing