Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何删除NDB数据库的StructuredProperty(或RepeatedProperty)中的单个项?_Python_Database_Google App Engine - Fatal编程技术网

Python 如何删除NDB数据库的StructuredProperty(或RepeatedProperty)中的单个项?

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

我有一个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.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()