Python 如何删除NDB数据库的StructuredProperty(或RepeatedProperty)中的单个项?
我有一个ndb.Model,其中包含一个重复属性Python 如何删除NDB数据库的StructuredProperty(或RepeatedProperty)中的单个项?,python,database,google-app-engine,Python,Database,Google App Engine,我有一个ndb.Model,其中包含一个重复属性 class Resort(ndb.Model): name = ndb.StringProperty() hotel_keys = ndb.KeyProperty(repeated=True) 我把一张“钥匙”的清单放在“酒店钥匙”里。 然后我需要删除其中的一项(比如通过id) 我怎么能这么做 resort = Resort.get_by_id(resort_id) for hotel_key in resort
class Resort(ndb.Model):
name = ndb.StringProperty()
hotel_keys = ndb.KeyProperty(repeated=True)
我把一张“钥匙”的清单放在“酒店钥匙”里。
然后我需要删除其中的一项(比如通过id)
我怎么能这么做
resort = Resort.get_by_id(resort_id)
for hotel_key in resort.hotel.keys:
if hotel_key.id() == id:
del ???
resort.put()
我将感谢任何帮助。谢谢。重复属性是列表,不可能同时迭代列表并从中删除值。您应该创建一个列表副本,但不包含要删除的值-请参见此问题:重复属性是列表,不可能同时迭代列表并从中删除值。您应该创建一份列表副本,但不包含要删除的值-请参见此问题:以下是一种无需迭代即可将其删除并删除的方法:(仅适用于repeated keyproperty,因为它实际具有单个属性id的字符串表示形式,对于repeated structured属性,您必须循环并对照要删除的属性进行检查,在循环后获取索引并删除)
这里有一种无需迭代即可删除它的方法:(仅适用于重复的keyproperty,因为它实际上是一个带有单个属性id的字符串表示,对于重复的结构化属性,您必须循环并检查要删除的属性,在循环后获取索引并删除)
repeated属性只是一个列表,而您放入列表中的实体相当简单。因此,您可以只使用pop和索引,而不使用循环。put()
repeated属性只是一个列表,而您放入列表中的实体相当简单。因此,您可以只使用pop和索引,而不使用循环。put()
我发现使用列表的
remove()
方法效果很好:
if some_hotel_key in resort.hotel_keys:
resort.hotel_keys.remove(some_hotel_key)
resort.put()
请注意,我在这里使用的是实际的NDB钥匙,而不是钥匙ID。这假设hotel_Keys
属性是一些其他型号类别的钥匙列表,如。如您的度假酒店
类别应更新为:
hotel\u keys=ndb.KeyProperty(kind=hotel,repeated=True)
然后确保您在某个地方定义了一流酒店(ndb.Model)
。这样您就可以定义:
some\u hotel\u key=ndb.key(hotel,'myHotel')
重申我在上面留下的一个注意事项:它只会弹出一个值实例。如果存在风险,您的.hotel\u keys
属性有重复项,请务必处理。我会使用resort.hotel\u keys=list(set(resort.hotel\u keys))
在获取要删除的索引之前。我发现使用列表的
remove()
方法效果很好:
if some_hotel_key in resort.hotel_keys:
resort.hotel_keys.remove(some_hotel_key)
resort.put()
请注意,我在这里使用的是实际的NDB钥匙,而不是钥匙ID。这假设hotel_Keys
属性是一些其他型号类别的钥匙列表,如。如您的度假酒店
类别应更新为:
hotel\u keys=ndb.KeyProperty(kind=hotel,repeated=True)
然后确保您在某个地方定义了一流酒店(ndb.Model)
。这样您就可以定义:
some\u hotel\u key=ndb.key(hotel,'myHotel')
重申我在上面留下的一个注意事项:它只会弹出一个值实例。如果存在风险,您的.hotel\u keys
属性有重复项,请务必处理。我会使用resort.hotel\u keys=list(set(resort.hotel\u keys))
在获取要删除的索引之前。注意:它只会弹出值的一个实例。如果有风险,请确保您的列表有重复项,请务必处理。我会使用
y.hotel\u key
=list(set(y.hotel\u key))`在获取要删除的索引之前。注意:它只会弹出值的一个实例。如果有风险,您的列表有重复项,请务必处理。在获取要删除的索引之前,我会使用y.hotel\u keys
=list(set(y.hotel\u keys))`。
if some_hotel_key in resort.hotel_keys:
resort.hotel_keys.remove(some_hotel_key)
resort.put()