解决方法从NDB中的ComputedProperty函数返回列表

时间:2012-01-17 11:31:31

标签: python google-app-engine google-cloud-datastore python-2.7 app-engine-ndb

我正在将我的应用转换为使用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

目前它会经历第一个条件,并在返回空列表时发出错误。

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

2 个答案:

答案 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)