timedelta转换为time或int并将其存储在GAE(python)数据存储区中

Sol*_*oub 4 python google-app-engine

看起来在其他问题中已经有所涉及,但我仍然对如何实际做到这一点感到困惑.我缺乏经验对此没有多大帮助.

我有两个DateTimeProperties - StartTime和EndTime.我从EndTime中减去StartTime以获得持续时间.从我之前的问题(感谢所有回答!)看起来这个操作正在生成timedelta.

似乎没有被直接存储timedelta在GAE数据存储的简单方法,所以这意味着我需要它要么转换为int以毫秒为单位,一个漂浮在几秒或时间.

我稍后还需要对此进行其他计算,例如计算平均值.持续时间.基于此,int似乎对我现在最有意义.

最好的方法是什么,或者有一个我可以玩的教程?

谢谢!

Nic*_*son 12

为了使其尽可能简单,有两个步骤:将timedelta转换为int或float,并将其存储在数据存储区中.首先,将timedelta转换为microtime:

def timedelta_to_microtime(td):
  return td.microseconds + (td.seconds + td.days * 86400) * 1000000
Run Code Online (Sandbox Code Playgroud)

但是,您不必自己进行转换 - 您可以定义自定义数据存储区属性,这样您就可以将timedeltas直接存储到模型中:

class TimeDeltaProperty(db.Property):
  def get_value_for_datastore(self, model_instance):
    value = self.__get__(model_instance, model_instance.__class__)
    if value is not None:
      return timedelta_to_microtime(value)

  def make_value_from_datastore(self, value):
    if value is not None:
      return datetime.timedelta(microseconds=value)
Run Code Online (Sandbox Code Playgroud)

现在您可以像任何其他属性一样使用此属性:

class MyModel(db.Model):
  td = TimeDeltaProperty(required=True)

entity = MyModel(td=datetime.datetime.now()-some_datetime)
key = entity.put()

entity = db.get(key)
print entity.td
Run Code Online (Sandbox Code Playgroud)