Arn*_*e S 3 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)
Run Code Online (Sandbox Code Playgroud)
这导致以下结果:
Properties:
StringProperty('rooms', repeated=True)
StringProperty('name')
Repeated:
None
None
Run Code Online (Sandbox Code Playgroud)
实际上,下划线前缀选项是官方API.这是一个他们没有记录的错误,我会修复它.我在这里解释了一下:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id = 187
特别是,要获取模型的属性,您应该使用House._properties,而不是Nick提出的代码.(实际上,__dict__在未来的NDB版本中可能会替换为插槽.)
NDB目前不提供内省创建模型的任何选项; 你一定要提出一个关于这个的错误.与此同时,探索对象的内部是唯一的方法.请注意,这是非常脆弱的,因为内部实施细节可以随时改变.
您可以获得这样的属性列表:
properties = [(k, v) for k, v in House.__dict__.items() if isinstance(v, ndb.Property)]
Run Code Online (Sandbox Code Playgroud)
您可以通过访问_repeated实例上的内部属性来确定属性是否重复- 但请参阅上面的免责声明,了解为什么这可能是一个坏主意:
House.rooms._repeated
Run Code Online (Sandbox Code Playgroud)
要么
getattr(House, 'rooms')._repeated
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2181 次 |
| 最近记录: |