当我有一个NDB重复属性时,我必须迭代列表以找到我正在寻找的属性。当我查看数据存储区时,结构化属性的每个属性都是一个列表。我以为我可以使用Python列表索引方法,但这不起作用。
所以有一种简单的方法可以找到我需要的结构化属性实例。
class Instance(ndb.Model)
instance_id = ndb.StringProperty()
instance_data = ndb.TextProperty()
class Example(ndb.Model):
instances = ndb.StructuredProperty(Instance, repeated = True)
我试过了:
instance_id = 'thisone'
index = entity.instances.instance_id.index(instance_id)
data = entity.instances.instance_data[index]
但我必须:
instance_id = 'thisone'
for each in entity.instances :
if each.instance_id = instance_id :
instance_data = each.instance_data
break
答案 0 :(得分:2)
所以这就是问题 - entity.instances是一个python列表,按照documentation here。你想要做的更像是一个字典。有一个功能请求,Guido在Google群组中拒绝了,这似乎与您提出的要求相同:https://groups.google.com/d/topic/appengine-ndb-discuss/Kj7Ymhr5hlE/discussion
entity.instances [0]返回该列表中的第一个实例。所有其他List操作似乎也可以正常工作。但是你正试图有效地查询该列表。
如果您已经知道ID是什么并且列表很大,您可以始终将该ID设置为密钥,并调用数据存储区以获取该实例。在创建实例时,请执行以下操作:
new_instance = Instance(id=instance_id, instance_data=some_data)
然后像这样加载它:
existing_instance = Instance.get_by_id(instance_id)