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.pyext.ndbで、タイプに応じて値を処理するif / elseステートメントがいくつかあるところComputedPropertyから継承していることがわかりました。ただし、GenericProperty_db_set_valuelists

現在、最初の条件を通過し、空のリストを返すとそのエラーが発生します。

これを回避してエラーを回避する方法はありますか?

4

2 に答える 2

13

NDBの計算プロパティにrepeatered=Trueフラグを設定する必要があります。かわいい「@db.ComputedProperty」表記は使用できないと思います。次のように言う必要があります。

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

この機能全体は関数内で実行できるため、である必要はありませんComputedProperty。クエリする可能性のある計算を実行する場合にのみ、計算済みプロパティを使用します。AComputedPropertyindexedフラグを設定できます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 に答える