2011-11-30 57 views
4

我正在使用谷歌应用程序引擎/ python。我创建了一个自定义的数据类型和属性。但我有使用它的问题。这是我的定义在Google App Engine中使用自定义属性

from datetime import datetime 

class MyDateTime(datetime): 
    def __str__(self): 
     return self.strftime("%Y-%m-%d %H:%M") 

class MyDateTimeProperty(db.Property): 
    # specify datatype 
    data_type = MyDateTime 

    # For writing to datastore. 
    def get_value_for_datastore(self, model_instance): 
     return super(MyDateTimeProperty, self).get_value_for_datastore(model_instance) 

    # For reading from datastore. 
    def make_value_from_datastore(self, value): 
     return super(MyDateTimeProperty, self).validate(value) 

class MyClass(db.Model): 
    date = MyDateTimeProperty() 

,这是我如何使用它:

obj = MyClass(date=MyDateTime(2011,1,1)) 
obj.put() 

,我得到了以下错误消息:

Traceback (most recent call last): 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\admin\__init__.py", line 295, in post 
    exec(compiled_code, globals()) 
    File "<string>", line 23, in <module> 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1052, in put 
    self._populate_internal_entity() 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1020, in _populate_internal_entity 
    self._entity = self._populate_entity(_entity_class=_entity_class) 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1092, in _populate_entity 
    self._to_entity(entity) 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1005, in _to_entity 
    self.__set_property(entity, prop.name, prop.get_value_for_datastore(self)) 
    File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 995, in __set_property 
    entity[name] = datastore_value 
    File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore.py", line 881, in __setitem__ 
    datastore_types.ValidateProperty(name, value) 
    File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_types.py", line 1477, in ValidateProperty 
    'Unsupported type for property %s: %s' % (name, v.__class__)) 
BadValueError: Unsupported type for property date: <class '__main__.MyDateTime'> 

我搜索解决方案一段时间并不能解决它。如果有人知道如何解决它,请提前致谢。


感谢您的回答。我想通了,首要的问题是,自定义数据类型不能进入数据存储,所以我需要/从平常使用的数据类型和get_value_for_datastoremake_value_from_datastore

这是我修改的属性定义来包装/解包自定义数据类型:

class MyDateTimeProperty(db.Property): 
    # specify datatype 
    data_type = MyDateTime 

    # For writing to datastore. 
    def get_value_for_datastore(self, model_instance): 
     date = super(MyDateTimeProperty, self).get_value_for_datastore(model_instance) 
     return datetime(date.year, date.month, date.day, date.hour, date.minute) 

    # For reading from datastore. 
    def make_value_from_datastore(self, value): 
     if value is None: 
      return None 
     return MyDateTime(value.year, value.month, value.day, value.hour, value.minute) 

的关键是,使用get_value_for datastore改变一个不可存储MyDateTime对象为可存储日期时间对象,make_value_from_datastore反之亦然。

+2

如果这是真实的代码而不是演示,您可以考虑在模板过滤器中处理日期格式,而不是定制属性。 –

+1

我同意德鲁 - 这是很多箍环,只是为了在'str'上获得自定义行为。 –

回答

3

如果您的Property子类的数据类型不是默认验证程序知道的已定义数据存储数据类型之一,则需要定义validate()方法。 this article中有一个示例验证方法。

相关问题