如何以编程方式确定ndb属性是否为多值

时间:2012-05-21 18:15:02

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

我正在将应用程序从Datastore转换为ndb,并在xml导入例程中遇到问题。问题是我无法以编程方式确定ndb.model类的属性是否是多值属性。

我怀疑这是由于缺乏基本的Python技能,因为到目前为止我提出的代码显示该值是“可见的”。因此我无法抓住它。请帮忙。

from google.appengine.ext import ndb

class House(ndb.Model):
  name = ndb.StringProperty()   
  rooms = ndb.StringProperty(repeated=True) 

print 'Properties:'
for p in House._properties:
  print getattr(House,p)

print '\nRepeated:'
for p in House._properties:
  print getattr(getattr(House,p),'repeated',None)

这导致以下结果:

Properties:
StringProperty('rooms', repeated=True)
StringProperty('name')

Repeated:
None
None

2 个答案:

答案 0 :(得分:8)

实际上,下划线前缀选项官方API。这是一个他们没有记录的错误,我会修复它。我在这里解释了一点:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=187

特别是,要获取模型的属性,您应该使用House._properties,而不是Nick提出的代码。 (实际上,__dict__可能会在未来的NDB版本中替换为插槽。)

答案 1 :(得分:6)

NDB目前不提供内省创建模型的任何选项;你绝对应该file a bug这个。与此同时,探索对象的内部是唯一的方法。请注意,这是非常脆弱的,因为内部实施细节可以随时改变。

您可以获得以下属性列表:

properties = [(k, v) for k, v in House.__dict__.items() if isinstance(v, ndb.Property)]

您可以通过访问实例上的_repeated内部属性来确定属性是否重复 - 但请参阅上面的免责声明,了解为什么这可能是一个坏主意:

House.rooms._repeated

OR

getattr(House, 'rooms')._repeated