2013-07-30 34 views
1

內的元素我有一個StructuredProperty,看起來像這樣: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'[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的。 然後您就需要更新各自的「單位部門」屬性,刪除任何你不想要的,然後重新把實體:

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

ndb.put_multi(users) 

結構化屬性不(或不應該)作爲獨立的實體存在,所以你不能獨立於包含它們的實體來獲取它們,並且不能直接刪除它們。

+0

太好了。謝謝你的幫助。 – Jeff

相關問題