2015-02-11 51 views
1

我有像下面這樣的模型結構:我正在使用最新的python SDK for谷歌應用程序引擎。如何從結構化屬性中刪除實體 - python GAE?

class Address(ndb.Model): 
    type = ndb.StringProperty() # E.g., 'home', 'work' 
    street = ndb.StringProperty() 
    city = ndb.StringProperty() 
class Contact(ndb.Model): 
    name = ndb.StringProperty() 
    addresses = ndb.StructuredProperty(Address, repeated=True) 
guido = Contact(
    name='Guido', 
    addresses=[Address(type='home',city='Amsterdam'), 
    Address(type='work', street='Spear St', city='SF')] 
    ) 
guido.put() 

我使用

addresses = Contact.query(Contact.name=="Guido").get().addresses 
for address in addresses: 
    if address.type == "work": 
     # remove this address completely 
     pass 

從這個guido模式,我想刪除「工作」地址圭多模型得到的地址。這也應該在聯繫人和地址模式中刪除。我該怎麼做呢。在這種情況下,實體鍵將在運行時自動分配。

回答

2

你需要做的是從列表中刪除該項目並保存。類似這樣的:

guido = Contact.query(Contact.name == 'Guido').get() 
guido.addresses = [i for i in guido.addresses if i.type != 'work'] 
guido.put() 

我們在這裏做的是獲取聯繫人,過濾其地址,然後將其保存回數據庫。不需要進一步的工作。

至於有關刪除地址實體混亂,refer to the docs

雖然地址實例使用相同的語法爲模型類定義的,它們不是完全的實體。他們在數據存儲區中沒有自己的密鑰。他們無法獨立於其所屬聯繫人實體進行檢索。

這意味着你不需要單獨刪除:)看看你的數據存儲瀏覽器,只有一個聯繫人實體應該顯示出來,而不管你添加了多少個地址。

+0

它會從數據庫(從地址模型)中刪除「工作」地址嗎? – sengottuvel 2015-02-11 18:03:47

+0

地址不單獨保存,它存儲在聯繫人實體內。我更新了答案,並參考了關於此問題的文檔。 – 2015-02-11 18:15:16

+0

是否可以使用StructuredProperty來包含一個實體?(因爲地址在這裏不是一個真正的實體) – sengottuvel 2015-02-11 18:44:10