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 回答