次のようなクラスがあります。
class MBObject(ndb.Model):
id = ndb.StringProperty()
dictionary = ndb.JsonProperty(indexed=False, default = {})
私が欲しいのは、誰かが次のように MBObject を持っているかどうかです:
obj = MBObject()
次のように、任意のプロパティにアクセスします。
x = obj.author_id
舞台裏でこれを行うこと:
x = obj.dictionary["author_id"]
したがって、基本的にアクセスするプロパティが何であれ、クラスのプロパティにアクセスするのではなく、そのプロパティの辞書を調べます。
そして、これはセッターにも当てはまります:
x.author_id = 5
に変換する必要があります
x.dictionary["author_id"] = 5
これは Python で可能ですか。
(理由は聞かないでください。説明すると長くなってしまいます)
編集: わかりました。理由は次のとおりです。
サブクラスは Google App Engine では困難です。2 つの異なるクラス オブジェクトを作成し、1 つのクエリを実行して異なるクラス タイプのオブジェクトを取得することはできません。たとえそれらが同じ基本クラスから継承されていたとしてもです。for ループを使用してクエリを実行するか、PolyModel と呼ばれるものを使用する必要がありますが、これにより書き込みコストが増加します。
だから私が欲しいのは、事前定義された構造のない動的クラスです。GAE Expando クラスは使用したくありません。すべてのプロパティがデフォルトでインデックス化されているため、書き込みが非常に高価になるからです。(デフォルトをインデックスなしに設定できますが、インデックス付きとインデックスなしが必要ですが、それは提供されません)
したがって、私の唯一の選択肢は、すべてのプロパティを辞書に入れることです。便宜上、オブジェクト指向のように見せて、プロパティが実際に辞書に隠されているという事実を隠す必要があると考えました。