2013-07-30 3 views
1

У меня есть StructuredProperty, который выглядит следующим образом:App Engine - Datastore - 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'[email protected]') 

Я хотел бы, чтобы удалить все поставщика, который на «значение» == «система».

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 

Любая помощь будет принята с благодарностью.

ответ

0

Ваш запрос должен выглядеть следующим образом:

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

Это будет возвращать все userDBs, которые имеют поставщика со значением == «системы». Затем вам нужно обновить свойство «Orgs» каждого из них, удаляя любые, которые вы не хотите, а затем снова поставить объекты:

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

ndb.put_multi(users) 

Структурированные свойства не (или не должны) существуют как независимые объекты, поэтому вы не можете извлекать их независимо от сущности, которая их содержит, и не может удалить их напрямую.

+0

Отлично. Спасибо за вашу помощь. – Jeff

Смежные вопросы