1

我有一个 ndb.Model,它有一个 ndb.DateTimeProperty 和一个使用 ndb.DateTimeProperty 创建时间戳的 ndb.ComputedProperty。

import time
from google.appengine.ext import ndb

class Series(ndb.Model):
    updatedDate = ndb.DateTimeProperty(auto_now=True)
    time = ndb.ComputedProperty(lambda self: time.mktime(self.updatedDate.timetuple()))

我遇到的问题是第一次调用 .put() (seriesObj 只是从 Series 类创建的对象)

seriesObj.put()

此时 ndb.DateTimeProperty 为空。我收到以下错误:

File "/main.py", line 0, in post series.put()
time = ndb.ComputedProperty(lambda self: time.mktime(self.updatedDate.timetuple()))
AttributeError: 'NoneType' object has no attribute 'timetuple'

我可以说这只是因为 ndb.DateTimeProperty 没有设置,但我不知道如何在 ndb.ComputedProperty 读取它之前设置它。

这不是 ndb.ComputedProperty 的问题,因为我已经使用 ndb.DateTimeProperty 集对其进行了测试,并且工作正常。

任何和所有的帮助都会很棒!

4

3 回答 3

1

想通了问题,其实是一个简单的解决方案。我只是编辑了这一行

updatedDate = ndb.DateTimeProperty(auto_now=True)

包括默认参数

updatedDate = ndb.DateTimeProperty(auto_now=True, default=datetime.datetime.now())

还必须导入 datetime 模块

import datetime

更新后,就可以毫无错误地创建对象。现在它不仅会正常运行,还会将 updateDate 的初始值设置为当前日期和时间。糟糕的是 auto_now 参数不会自动执行此操作。

感谢所有花时间帮助我解决此问题的人!

于 2013-08-12T03:37:38.717 回答
1

进一步调查此问题后,避免在导入模块时评估默认值。我刚刚updatedDate在创建新的Series.

import datetime
series = Series(updatedDate = datetime.datetime.now())
series.put()

我本来希望使用更“不考虑它”的解决方案,_pre_put_hook但在测试中,它似乎在评估time ComputedProperty.

于 2013-08-13T02:46:27.030 回答
0

问题是 DateTimeProperty(auto_now=True) 直到放置时间才解决。与计算属性相同。正如您所发现的,ComputedProperty 也会同时进行评估。

然而,这是疣,声明的顺序似乎没有被保留,(我在尝试根据模型的属性自动生成表单时发现了这一点)。属性未存储在 OrderedDictionary 中,因此无法保证顺序,因此您会发现在ComputedProperty time解析 udpatedDate 之前正在解析。

你应该如何解决这个问题?

不确定,理论上您可以在Series每次需要创建实体时使用工厂来创建实体,并在创建对象时显式设置 DateTime。这意味着当您放置对象时,ComputedProperty 将得到解析,并且可能只会出现几分之一秒。

但是,这可能无法确保在未来的更新中正确评估 ComputedProperty。ComputedProperty 很可能会使用旧值而不是 updatedDate 的新值,因为您仍然无法强制属性评估的顺序。

我个人认为这是对 ndb Model 类的一个错误或非常需要的增强。

这可能意味着您应该使用您总是调用的 Series 方法,update而不是在调用 put 之前显式设置 updateDate 的 put。

IE

def update(self):
   self.updatedDate = datetime.now()
   self.put()

可能更好的方法是使用 pre_put 挂钩在调用 put 之前显式设置 udpateDate。我没有对此进行测试以确保在属性评估之前调用它,但我猜它会

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model__pre_put_hook

凌乱-我知道;-)

于 2013-08-11T10:53:49.187 回答