App Engine - Datastore - Python: Delete element within a StructuredProperty

本秂侑毒 提交于 2019-12-11 10:17:41

问题


I have a StructuredProperty that looks like this:

userDB(key=Key('userDB', 5580090230439936), name=u'Super User', orgs=[providers(name=u'Comp, Inc.', password=u'1111111', url=None, username=u'111111', value=u'comp'), providers(name=u'Systems, Inc.', password=u'2222222', url=None, username=u'222222', value=u'system')], update=None, userID=u'super@example.com')

I would like to delete every provider who's 'value' == 'system'.

class providers(EndpointsModel):
    name = ndb.StringProperty()
    value = ndb.StringProperty()
    url = ndb.StringProperty()
    username = ndb.StringProperty()
    password = ndb.StringProperty()

class userDB(EndpointsModel):
    userID = ndb.StringProperty(required=True, indexed=True)
    name = ndb.StringProperty(required=True, indexed=True)
    update = ndb.DateTimeProperty(auto_now_add=True, indexed=True)
    orgs = ndb.StructuredProperty(providers, repeated=True, indexed=True)
    system = ndb.StructuredProperty(system, repeated=True, indexed=True)
    comp = ndb.StructuredProperty(comp, repeated=True, indexed=True)

I tried this:

def delOrgs(key, X): #Key is a userDB key and X is a list ['system']
for B in X:
    for A in key[0].get().orgs:
        del_provider = key[0].get().query(A.value == B).fetch(keys_only=True)
        #del_provider[0].delete()
        logging.info(del_provider)

but i get the following error:

TypeError: Cannot filter a non-Node argument; received False

Any help would be greatly appreciated.


回答1:


Your query should look like:

userDB.query(userDB.orgs.value == 'system)

This will return all of the userDBs which have a provider with value == 'system'. You'll then need to update the 'orgs' property of each, removing any that you don't want, and then re-put the entities:

users = query.fetch()
for user in users:
  user.orgs = filter(lambda provider: provider.value != 'system', user.orgs)

ndb.put_multi(users)

Structured properties don't (or shouldn't) exist as independent entities, so you can't fetch them independently of the entity that contains them, and can't delete them directly.



来源:https://stackoverflow.com/questions/17950774/app-engine-datastore-python-delete-element-within-a-structuredproperty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!