6

エンティティが設定された後、NDB で設定されていない繰り返しプロパティをテストするにはどうすればよいですか?

私が見つけることができる唯一の参照は言う:

繰り返しプロパティに対して None の値をクエリすると、未定義の動作になります。それをしないでください。

4

1 に答える 1

9

繰り返されるプロパティのリストの内容に何も追加しない場合、値は送信され<missing>ず、プロパティは次のように表示されます。<null>

クエリとインデックスに関する App Engine のドキュメントによると、プロパティの値を持たないエンティティと null 値を持つエンティティは区別されます。と

フィルター処理されたプロパティのないエンティティは、クエリによって返されることはありません。

したがって、これらの古いレコードに対するクエリを作成することはできません。

上記の
AppEngine: Query datastore for records with <missing> valueで引用された残りの回答を参照してください。

そのようなものをクエリできるようにしたい場合は、データ モデルでこれを強制する必要があります。たとえばndb.ComputedProperty、対応するリストの長さがゼロかどうかに対応するブール値であるa を持つことができます。

class MyModel(ndb.Model):
  my_repeat = ndb.StringProperty(repeated=True)
  sentinel = ndb.ComputedProperty(lambda self: len(self.my_repeat) == 0)

これらの欠損値を照会するには、次を使用できます

MyModel.query(MyModel.sentinel == True)

そのようなオブジェクトの既存のセットがデータストアにある場合は、それらに対して 1 回限りのmapreduceを実行し、更新されたモデル定義を使用して各エンティティを取得し、それぞれをデータストアに戻すことができます。これにより、既存のすべてのプロパティが同じままになり、sentinel値が更新されます。

于 2012-12-18T17:06:20.860 に答える