4

我正在将我的应用程序转换为使用 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继承自GenericPropertywhere_db_set_value有几个 if/else 语句根据其类型处理值,除了没有处理lists

目前它通过第一个条件并在我返回一个空列表时给出该错误。

有没有办法解决这个问题并避免错误?

4

2 回答 2

13

您需要在 NDB 中为您的计算属性设置重复 = True 标志。我认为您不能使用可爱的“@db.ComputedProperty”表示法,您必须说:

def _computeValue(self):
    ...same as before...
someComputedProperty = ComputedProperty(_computeValue, repeated=True, indexed=False)
于 2012-01-18T03:00:18.333 回答
3

这整个功能可以在一个函数中完成,所以它不需要是ComputedProperty. 仅当您想要进行可能查询的计算时才使用计算属性。AComputedProperty可以将其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) 
于 2012-01-17T14:08:31.633 回答