1

我有一个如下所示的 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')

我想删除每个“价值”==“系统”的提供者。

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)

我试过这个:

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)

但我收到以下错误:

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

任何帮助将不胜感激。

4

1 回答 1

0

您的查询应如下所示:

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

这将返回所有具有值 == 'system' 的提供程序的用户数据库。然后,您需要更新每个的 'orgs' 属性,删除任何您不想要的,然后重新放置实体:

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

ndb.put_multi(users)

结构化属性不(或不应该)作为独立实体存在,因此您不能独立于包含它们的实体来获取它们,也不能直接删除它们。

于 2013-07-30T17:25:55.437 回答