在Google App Engine NDB中,有一个属性类型JsonProperty,该属性类型使用Python list或字典并自动对其进行序列化。

我的模型的结构取决于此问题的答案,因此我想知道何时将对象反序列化?例如:

# 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']

最佳答案

ndb.JsonProperty跟随the docs并以与定义自定义属性时相同的方式进行操作:它定义了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%确定,则每次升级时都必须重新运行测试或重新阅读代码。

10-08 07:33