1

我有一個GAE應用程序,它使用NDB數據存儲和python向僱員分配任務。我有具有任務數組的任務實體和員工實體(存儲任務的密鑰)。我試圖實現一個「級聯刪除」,在這裏我可以通過我的刪除功能刪除任務的關鍵,並將其「級聯」到員工實體以清除對該任務的引用。現在我的刪除任務功能正常工作,但不能正確級聯。當我刪除一項任務並查看已分配該任務的員工時,其關鍵值仍顯示出來。我會非常感謝任何人都可以提供的指針!GAE,NDB,Python應用程序的「級聯刪除」

我的實體定義是在一個db_models文件,與任務實體(只包含名字作爲一個字符串)和僱員實體具有任務的數組:

class Employee(ndb.Model): 
    name = ndb.StringProperty(required=True) 
    title = ndb.StringProperty(required=True) 
    tasks = ndb.KeyProperty(repeated=True) 

    def to_dict(self): 
     d = super(Employee, self).to_dict() 
     d['tasks'] = [m.id() for m in d['tasks']] 
     return d  

我刪除功能,這點我想過去的'did'或要刪除的任務實體的密鑰

class TaskDelete(webapp2.RequestHandler): 
    def get(self, **kwargs): 
     if 'application/json' not in self.request.accept: 
      webapp2.abort(406, details="Not Acceptable, API only supports application/json MIME type") 
      return 
     if 'did' in kwargs: 
      entity = ndb.Key(db_models.Task, int(kwargs['did'])).delete() 
     q = db_models.Employee.query() 
     key = q.fetch(keys_only=True) 
     for x in key: 
      employee = ndb.Key(db_models.Employee, int(x.id())).get() 
      for task in employee.tasks: 
       if 'did' == task: 
        task.delete() 
        employee.put() 
+0

,我不明白你爲什麼把它與一個字符串'做'比較? – marcadian

+0

對不起,忘了添加main.py部分,我實際上稱之爲東西!我使用curl來測試函數,並且是我傳入的任何密鑰。Im現在手動跟蹤我的任務鍵並直接傳入它們。這是從我的主app.router.add(webapp2.Route(r'/任務/ <:/?> /delete','task.TaskDelete')) – ChristinaLindsay

+0

您通過查詢獲取員工,如果這發生在更新,你會發現最終的一致性可能意味着你有陳舊的價值。爲了證明/反駁這個獲取你更新的實體的關鍵,並看看是否是這個問題。 –

回答

0

首先,您一次只需要一個員工,但速度很慢。相反的:

q = db_models.Employee.query() 
    key = q.fetch(keys_only=True) 
    for x in key: 
     employee = ndb.Key(db_models.Employee, int(x.id())).get() 

使用:

for employee in db_models.Employee.query(): 

現在,你只需要更新您的employee.tasks屬性:如果任務是關鍵的名單

 for task in employee.tasks: 
      if 'did' == task: 
       task.delete() 
       employee.tasks.remove(task) # add this line 
       employee.put() 
       break       # add this line too