JsonProperty仅在访问时反序列化吗?

时间:2012-11-19 23:43:14

标签: python google-app-engine

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

2 个答案:

答案 0 :(得分:1)

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%确定

答案 1 :(得分:1)

正确的答案是,它确实在访问时确实加载项目:

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