目标:获取" 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')
将key
而Thing
将评估为False,因为Example的实例具有由Python名称定义的属性'事物&# 39;
如何获取实例的属性? TIA。
答案 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')]}