获取 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')]}
目标: 从 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')]}