我正在利用ndb的to_dict方法将对象的属性转换为python dict。从我可以告诉的一切,这个方法根据文档不包括dict中对象的键或父:
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict
但是对于我的情况,我需要钥匙才能进入dict。我的偏好是利用内置方法并将其子类化或类似,而不是创建我自己的to_dict方法。
实现这一目标的最佳方式是什么,或者我错过了一些明显的东西?提前谢谢。
仅供参考:我不是在为这个项目利用django而是直接将python部署到gae。
答案 0 :(得分:33)
你没有遗漏任何东西; - )
只需在调用to_dict后将密钥添加到字典中,然后覆盖该方法。
如果您有多个模型与自定义to_dict不共享相同的基类,我会将其实现为mixin。
将to_dict定义为Mixin类的方法。你会
class ModelUtils(object):
def to_dict(self):
result = super(ModelUtils,self).to_dict()
result['key'] = self.key.id() #get the key as a string
return result
然后使用它。
class MyModel(ModelUtils,ndb.Model):
# some properties etc...
答案 1 :(得分:2)
实现这一目标的另一种简单方法(无需覆盖to_dict
)是添加一个返回id的ComputedProperty
,如下所示:
class MyModel(ndb.Model):
# this property always returns the value of self.key.id()
uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False)
# other properties ...
ComputedProperty
会像其他任何财产一样添加到to_dict
的结果中。
只有两个限制因素:
key
(因为这会与实际密钥冲突),id
也不起作用。此外,当您调用put()
时,计算值将写入数据存储区,因此会占用您的部分存储空间。
一个优点是,它支持include
开箱即用的exclude
和to_dict()
个参数。