1

Google App Engine NDBにはJsonProperty、Pythonlistまたはディクショナリを取得して自動的にシリアル化するプロパティタイプがあります。

私のモデルの構造はこの質問への答えに依存しているので、オブジェクトがいつ逆シリアル化されるのか正確に知りたいですか?例えば:

# a User model has a property "dictionary" which is of type JsonProperty

# will the following deserialize the dictionary?

object = User.get_by_id(someid)

# or will it not get deserialized until I actually access the dictionary?

val = object.dictionary['value']
4

2 に答える 2

1

ndb.JsonPropertyドキュメントに従い、カスタムプロパティを定義するときと同じように、定義make_value_from_datastoreget_value_for_datastoreメソッドを実行します。

これらのメソッドをいつ呼び出すかは、アプリエンジン内のdb実装に依存するため、ドキュメントにはこれらのメソッドがいつ呼び出されるかは記載されていません。

ただし、モデルがデータベースにアクセスする必要があるときはいつでも、それらが呼び出される可能性が非常に高くなります。たとえば、次のドキュメントからget_value_for_datastore

プロパティクラスはこれをオーバーライドして、モデルインスタンスとは異なるデータ型をデータストアに使用したり、モデルインスタンスを保存する直前に他のデータ変換を実行したりできます。

何が起こっているのかを本当に確認する必要がある場合は、次のようにJsonPropertyの独自のサブクラスを提供できます。

class LoggingJsonProperty(ndb.JsonProperty):
    def make_value_from_datastore(self, value):
        with open('~/test.log', 'a') as logfile:
            logfile.write('make_value_from_datastore called\n')
        return super(LoggingJson, self).make_value_from_datastore(value)

必要に応じて、JSON文字列やバックトレースなどをログに記録できます。また、別のログに記録する代わりに、標準のログ機能を使用できることは明らかです。しかし、これは何が起こっているかを確認するのに十分なはずです。

もちろん、別のオプションは、にあると私が信じているコードを読むことですappengine/ext/db/__init__.py

文書化されていないため、詳細はバージョンごとに変わる可能性があります。100%確実にする必要がある場合は、アップグレードするたびにテストを再実行するか、コードを再読み込みする必要があります。

于 2012-11-20T01:08:15.143 に答える
1

正解は、アクセス時に実際にアイテムを遅延ロードするということです。

https://groups.google.com/forum/?fromgroups=#!topic/appengine-ndb-discuss/GaUSM7y4XhQ

于 2012-11-20T01:38:22.370 に答える