Google App Engine计算的属性日期返回抛出异常

时间:2014-03-26 06:13:05

标签: python google-app-engine

我的Google App Engine(Python)装饰器@db.ComputedProperty存在问题。

我有一个类似的模型:

class Employee(db.Model):
    name = db.StringProperty()
    date_of_join = db.DateProperty()

    @db.ComputedProperty
    def date_of_employment(self):
        return self.date_of_join

当我尝试将值插入模型时,它会抛出异常:

BadValueError: Unsupported type for property date_of_employment: <type 'datetime.date'>

可以计算属性返回/插入日期值吗?

修改

我找到了解决方案。 Appengine接受计算属性的日期时间,而不是日期对象:

class Employee(db.Model):
    name = db.StringProperty()
    date_of_join = db.DateProperty()

    @db.ComputedProperty
    def date_of_employment(self):
        return datetime.combine(self.date_of_join, datetime.min.time())

1 个答案:

答案 0 :(得分:1)

我说你在GAE中遇到了一个错误,它不允许将datetime.date用作ComputedProperty。

their issue tracker中有一个问题报告,但如果您感到好奇,相关代码就在这里:

  • google / appengine / api / datastore_types.py:ValidateProperty :因为datetime.date不在_VALIDATE_PROPERTY_VALUES中,_PROPERTY_TYPES也不是_PACK_PROPERTY_VALUES dicts
  • google / appengine / api / datastore_types.py:ValidateProperty :因为没有实现方式来&#34;打包&#34;将datetime.date转换为数据存储区友好值(即long),与datetime.datetime(PackDatetime)一样
  • 如果您使用的是ndb,则在 google / appengine / ext / ndb / model.py:GenericProperty:_db_set_value :因为ComputedProperty继承了它,并且_db_set_value没有考虑datetime.date

但是,用其中一名团队成员的话来说(查看问题报告):

  

对于datetime.date,当ndb从数据存储中读取ComputedProperty时,它会读取一个具有时间含义的整数。但是,它不知道是否应将其转换为datetime.date或datetime.datetime。当您使用DateProperty或DatetimeProperty时,ndb根据您的属性类型知道要转换的时间。

顺便说一句:我建议转移到新的ndb模块,而不是坚持使用db(但是,这个特殊情况也不会在那里工作)