1

我有一个 ndb.Model,其中包含一个 Repeated 属性。

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()

我将不胜感激任何帮助。谢谢。

4

4 回答 4

4

这是一种无需迭代即可删除它并删除的方法:(仅适用于重复的 keyproperty,因为它具有具有单个属性 id 的实际字符串表示,对于重复的结构化属性,您必须循环并检查要删除的属性 get循环后索引和删除)

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()
于 2013-10-07T17:47:50.037 回答
3

重复属性只是一个列表,您放入列表中的实体相当简单。所以你可以只使用 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> 
于 2013-10-07T23:24:26.287 回答
2

重复的属性是列表,不可能同时迭代一个列表并从中删除一个值。您应该创建一个没有要删除的值的列表副本 - 请参阅此问题:在迭代时从列表中删除项目

于 2013-10-07T15:12:55.703 回答
0

我发现使用列表的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)) 在获取要删除的索引之前使用。

于 2018-02-23T17:32:11.323 回答