15

我正在利用 ndb 的 to_dict 方法将对象的属性转换为 python dict。据我所知,根据文档,此方法不包括字典中对象的键或父对象:

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

但是,对于我的情况,我需要将密钥放在字典中。我的偏好是利用内置方法并将其子类化或类似的东西,而不是创建我自己的 to_dict 方法。

完成此任务的最佳方法是什么,或者我是否遗漏了一些明显的东西?提前致谢。

仅供参考:我没有在这个项目中使用 django,而是直接将 python 部署到 gae。

4

2 回答 2

36

你没有错过任何东西;-)

只需在调用 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...
于 2013-05-31T06:05:13.447 回答
3

实现这一点的另一种简单方法(无需覆盖to_dict)是添加一个ComputedProperty返回 id 的方法,如下所示:

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 ...

就像任何其他属性一样, AComputedProperty将被添加到结果中。to_dict

只有两个约束:

  1. 显然,属性的名称不能key(因为这会与实际键冲突)并且id也不起作用。
  2. 如果您在创建对象时没有指定键或 id,这将不起作用。

此外,当您调用 时,计算值将被写入数据存储put(),因此它会占用您的一些存储空间。

一个优点是它支持开箱即用的includeexclude参数 。to_dict()

于 2016-06-07T15:59:17.987 回答