我的模型结构如下所示:我使用最新的python SDK进行谷歌应用引擎。
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()
我使用
获取guido模型的地址addresses = Contact.query(Contact.name=="Guido").get().addresses
for address in addresses:
if address.type == "work":
# remove this address completely
pass
从这个guido
模型中,我想删除“工作”#39;地址。这也应该在Contact和Address模型中删除。我该怎么做呢。在这种情况下,实体密钥会在运行时自动分配。
答案 0 :(得分: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:
尽管使用与模型类相同的语法定义了Address实例,但它们并不是完整的实体。他们在数据存储区中没有自己的密钥。它们无法独立于它们所属的Contact实体进行检索。
这意味着您不需要单独删除它:)看看您的数据存储查看器,只显示一个联系人实体,与您添加的地址无关。