App Engine - 数据存储 - Python:删除StructuredProperty中的元素 [英] App Engine - Datastore - Python: Delete element within a StructuredProperty

查看:118
本文介绍了App Engine - 数据存储 - Python:删除StructuredProperty中的元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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 ')

我想删除所有'value'=='system'的供应商。

  class providers(EndpointsModel):
name = ndb.StringProperty()
value = ndb.StringProperty()
url = ndb.StringProperty()
username = ndb.StringProperty()
password = ndb.StringProperty()
$ b $ class class UserDB(EndpointsModel):
userID = ndb.StringProperty(required = True,indexed = True)
name = ndb.StringProperty(required = True,indexed = True)
update = ndb.DateTimeP roperty(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试试这个:

$ $ p $ def delOrgs(key,X):#Key是一个userDB键,X是一个list ['system' ]
for B in X:
for 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)

但我得到以下错误:

  TypeError:无法过滤非节点论据;收到False 

任何帮助将不胜感激。

解决方案

您的查询应该如下所示:

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

这将返回所有具有value = ='系统'。
然后,您需要更新每个的'orgs'属性,删除不需要的任何内容,然后重新放置实体:

<$对于用户中的用户:
user.orgs = filter(lambda提供商:provider.value!='系统',用户)的用户= query.fetch()
。 orgs)

ndb.put_multi(users)

结构化属性不会(或不应该)作为独立的实体存在,所以你不能独立于包含它们的实体来获取它们,并且不能直接删除它们。


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.

解决方案

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.

这篇关于App Engine - 数据存储 - Python:删除StructuredProperty中的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆