我有一个ndb。其中包含一个重复属性的模型。
class Resort(ndb.Model):
name = ndb.StringProperty()
hotel_keys = ndb.KeyProperty(repeated=True)
我将"键"列表放入"hotel_keys"属性中。然后我需要删除其中的单个项目(假设通过 id)我该怎么做?
resort = Resort.get_by_id(resort_id)
for hotel_key in resort.hotel.keys:
if hotel_key.id() == id:
del ???
resort.put()
我将不胜感激任何帮助。谢谢。
这是一种无需迭代即可删除它并删除的方法: (仅适用于重复的键属性,因为它具有具有单个属性 ID 的实际字符串表示形式,对于重复的结构化属性,您必须循环并检查要删除的属性 获取索引并在循环后删除)
key_to_delete = ndb.Key(ModelOfThatId, id)
if key_to_delete in resort.hotel_keys:
idx = resort.hotel_keys.index(key_to_delete)
del resort.hotel_keys[idx]
resort.put()
的属性只是一个列表,您放入列表中的实体相当简单。 因此,您可以只使用pop和index而不是循环。 放()
dev~fish-and-lily> class Resort(ndb.Model):
... hotel_keys = ndb.KeyProperty(repeated=True)
...
dev~xxx-and-zzz> y = XX()
dev~xxx-and-zzz> y.hotel_keys.append(ndb.Key('abc',1))
dev~xxx-and-zzz> y.hotel_keys.append(ndb.Key('abc',2))
dev~xxx-and-zzz> y.hotel_keys.append(ndb.Key('abc',3))
dev~xxx-and-zzz> y.hotel_keys.index(ndb.Key('abc',3))
2
dev~xxx-and-zzz> y.hotel_keys.pop(2)
Key('abc', 3)
dev~xxx-and-zzz> y.hotel_keys
[Key('abc', 1), Key('abc', 2)]
dev~xxx-and-zzz>
重复的属性是列表,不可能同时迭代列表并从中删除值。您应该创建一个不包含要删除的值的列表副本 - 请参阅此问题:迭代时从列表中删除项目<</p>
我发现使用列表的 remove()
方法效果很好:
if some_hotel_key in resort.hotel_keys:
resort.hotel_keys.remove(some_hotel_key)
resort.put()
请注意,我在这里使用的是实际的NDB密钥,而不是密钥ID。 这假定 hotel_keys
属性是某个其他模型类的键列表,例如。 就像您的Resort
类一样,应该更新为具有:
hotel_keys = ndb.KeyProperty(kind=Hotel, repeated=True)
然后确保你在某处定义了class Hotel(ndb.Model)
。 然后,这将允许您定义:
some_hotel_key = ndb.Key(Hotel, 'myHotel')
重申我上面留下的注释:它只会弹出该值的 1 个实例。如果您的.hotel_keys
资源存在重复的风险,请务必处理。我会使用resort.hotel_keys = list(set(resort.hotel_keys))
在获取要删除的索引之前。