ndb to_dict方法不包含对象的键

时间:2013-05-31 05:09:01

标签: python google-app-engine app-engine-ndb

我正在利用ndb的to_dict方法将对象的属性转换为python dict。从我可以告诉的一切,这个方法根据文档不包括dict中对象的键或父:

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

但是对于我的情况,我需要钥匙才能进入dict。我的偏好是利用内置方法并将其子类化或类似,而不是创建我自己的to_dict方法。

实现这一目标的最佳方式是什么,或者我错过了一些明显的东西?提前谢谢。

仅供参考:我不是在为这个项目利用django而是直接将python部署到gae。

2 个答案:

答案 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的结果中。

只有两个限制因素:

  1. 显然,该属性的名称不能是key(因为这会与实际密钥冲突),id也不起作用。
  2. 如果在创建对象时未指定键或id,则无效。
  3. 此外,当您调用put()时,计算值将写入数据存储区,因此会占用您的部分存储空间。

    一个优点是,它支持include开箱即用的excludeto_dict()个参数。