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

Get properties of ndb model instance where Python name != datastore name

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

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

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)

在第一种情况下,来自 self._properties.iteritems()key 将是 things。如果我有一个 Example 的实例,比如 example,那么 hasattr(example,'things') 将计算为 True。

在第二种情况下,key 将是 Thing 并且 hasattr(example,'Thing') 将评估为 False,因为 Example 的实例具有由 Python 名称定义的属性'things'.

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

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')]}