2011-11-30 3 views
4

Google app engine/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) 
보유 DateTime 개체에 저장 불가 MyDateTime 객체를 변경 get_value_for datastore을 사용하여 키가

, 및 make_value_from_datastore 반대로.

+2

이것이 실제 코드가 아닌 경우 사용자 지정 속성이 아닌 템플릿 필터에서 날짜 서식을 처리하는 것이 좋습니다. –

+1

나는 Drew에 동의한다 - 이것은 str에 대한 사용자 정의 동작을 얻기 위해 뛰어 넘기위한 많은 농구이다. –

답변

3

Property 하위 클래스는 데이터 유형이 기본 유효성 검사기가 알고있는 정의 된 데이터 저장소 유형 중 하나가 아닌 경우 validate() 메소드를 정의해야합니다. this article에는 예제 유효성 검사기 방법이 있습니다.

관련 문제