获取ndb模型实例的属性,其中Python名称为!= datastore name

时间:2015-02-10 14:49:09

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

目标:获取" Python名称"示例实例中的属性,其中模型使用不同的数据存储名称定义

为了提供一些上下文,我有一个自定义to_dict()方法来序列化NDB模型。该方法的核心如下:

for key, prop in self._properties.iteritems():
    if hasattr(self, key):
        value = getattr(self,key)
        # do typical to_dict() stuff

如果模型定义如下,一切都很好:

import Thing 
class Example(ndb.Model):
    things = ndb.KeyProperty(Thing, repeated=True)

但是,如果它定义了Python名称为things但数据存储名称为'Thing'的位置,则会出现问题:

# no import req'd
class Example(ndb.Model):
    things = ndb.KeyProperty('Thing', repeated=True)

在第一个方案中,key的{​​{1}}为self._properties.iteritems()。如果我有一个示例实例,请说things,那么example将评估为True。

在第二种情况下,hasattr(example,'things')keyThing将评估为False,因为Example的实例具有由Python名称定义的属性'事物&# 39;

如何获取实例的属性? TIA。

1 个答案:

答案 0 :(得分:3)

ndb自己的Model._to_dict方法执行如下操作(简化):

for prop in self._properties.itervalues():
  name = prop._code_name
  values[name] = prop._get_for_dict(self)

所以:名称取自每个属性的_code_name(而不是self._properties中的键,并且值被委托给属性本身(通过其_get_for_dict方法)到允许进一步调整。

因此,将您的示例编写为Example1和Example2,整个_properties.items()分别为:

[('things', KeyProperty('things', repeated=True, kind='Thing'))]
[('Thing', KeyProperty('Thing', repeated=True))]

他们的._to_dict(),根据需要,两者相等

{'things': [Key('Thing', 'roro')]}