在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_datastore
和get_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%确定,则每次升级时都必须重新运行测试或重新阅读代码。