簡體   English   中英

如何刪除NDB數據庫的StructuredProperty(或重復屬性)中的單個項目?

[英]How to remove a single item in StructuredProperty ( or Repeated Property) of an NDB database?

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

我將不勝感激任何幫助。 謝謝。

這是一種無需迭代即可刪除並刪除的方法:(僅適用於重復的鍵屬性,因為它實際上具有帶有單個屬性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()

重復屬性只是一個列表,您要放入列表中的實體非常簡單。 因此,您可以只使用pop和index而不是循環。 put()

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> 

重復的屬性是列表,並且不可能同時迭代列表並從中刪除值。 您應該創建列表的副本,但不包含要刪除的值-請參見以下問題: 迭代時從列表中刪除項目

我發現使用列表的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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM