如何从结构化属性中删除实体 - python GAE?

时间:2015-02-11 15:39:15

标签: python google-app-engine

我的模型结构如下所示:我使用最新的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模型中删除。我该怎么做呢。在这种情况下,实体密钥会在运行时自动分配。

1 个答案:

答案 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实体进行检索。

这意味着您不需要单独删除它:)看看您的数据存储查看器,只显示一个联系人实体,与您添加的地址无关。