从 NDB 中的 ComputedProperty 函数返回列表的解决方法
题
我正在将我的应用程序转换为使用 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.
我可以看到 model.py
在 ext.ndb 中 ComputedProperty
继承自 GenericProperty
在哪里 _db_set_value
有几个 if/else 语句根据值的类型来处理值,除了不处理 lists
目前,它会经历第一个条件,并在我返回空列表时给出该错误。
有没有办法解决这个问题并避免错误?
解决方案 2
整个功能可以在一个函数内完成,所以它不需要是一个 ComputedProperty
. 。仅当您想要执行可能查询的计算时才使用计算属性。A ComputedProperty
可以有它的 indexed
标志设置为 False
但这意味着您不会查询它,因此实际上不需要将其作为属性。
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)
其他提示
您需要为 NDB 中的计算属性设置repeated=True 标志。我认为你不能使用可爱的“@db.CompulatedProperty”符号,你必须说:
def _computeValue(self):
...same as before...
someComputedProperty = ComputedProperty(_computeValue, repeated=True, indexed=False)
不隶属于 StackOverflow