我正在将我的应用转换为使用NDB。我之前曾经有这样的事情:
@db.ComputedProperty
def someComputedProperty(self, indexed=False):
if not self.someCondition:
return []
src = self.someReferenceProperty
list = src.list1 + src.list2 + src.list3 + src.list4 \
+ [src.str1, src.str2]
return map(lambda x:'' if not x else x.lower(), list)
正如您所看到的,我生成列表的方法有点复杂,我更喜欢这样做。但是当我开始转换为NDB时,我只是将@db.ComputedProperty
替换为@model.ComputedProperty
,但后来我遇到了这个错误:
NotImplementedError: Property someComputedProperty does not support <type 'list'> types.
我可以在ext.ndb中的model.py
中看到ComputedProperty
继承自GenericProperty
_db_set_value
中有几个if / else语句根据其处理值类型,但不处理lists
目前它会经历第一个条件,并在返回空列表时发出错误。
有没有办法解决这个问题并避免错误?
答案 0 :(得分:13)
您需要在NDB中为您的计算属性设置repeated = True标志。我不认为你可以使用可爱的“@ db.ComputedProperty”表示法,你不得不说:
def _computeValue(self):
...same as before...
someComputedProperty = ComputedProperty(_computeValue, repeated=True, indexed=False)
答案 1 :(得分:3)
这整个功能可以在一个函数内完成,因此它不需要是ComputedProperty
。仅当您要执行可能要查询的计算时,才使用“计算属性”。 ComputedProperty
可以将indexed
标记设置为False
,但这意味着您不会查询它,因此不需要将其作为属性。< / p>
def someComputedProperty(self):
if not self.someCondition:
return []
src = self.someReferenceProperty
list = src.list1 + src.list2 + src.list3 + src.list4 \
+ [src.str1, src.str2]
return map(lambda x:'' if not x else x.lower(), list)