2014-04-27 64 views
2

我有兩個類,DepartmentEmployeeDepartment有一個屬性聲明爲突變ndb重複屬性

employees = ndb.KeyProperty(kind=ClassB, repeated=True)

的問題是,當我刪除其關鍵在employees名單舉行的實體,該實體在Employee數據存儲被刪除,但在Department數據存儲列表保持相同(與刪除的員工的關鍵仍在其中)。

我如何確保當Employee被刪除時,Department數據存儲中的所有引用也被刪除?

回答

1

我終於找到了一種方法來幹這事在class A (Department)創建的方法是這樣

def deleteEmployee(self, employee): 
    employee_to_delete = employee.key 
    if employee_to_delete in self.employees: 
     idx=self.employees.index(employee_to_delete) 
     del self.employees[idx] 
     self.put() 

,然後從處理程序(也可能是某處的另一種方法),我在哪裏從列表中刪除的關鍵,我做了這樣的事情

class DeleteEmployeeHandler(webapp2.RequestHandler): 
def post(self): 
    employee_name = self.request.get('employee_name') 
    employee=Employee.get_by_id(employee_name) 
    emp_dept=employee.department 
    dept=Department.get_or_insert(emp_dept) 
    dept.deleteEmployee(employee) #delete employee key from list 
    employee.key.delete() #then finally delete employee entity 
1

沒有這樣做的自動方式。

您需要爲所有可能存放密鑰的類型執行查詢,然後在代碼中將其刪除。

如果可能有很多和/或可能需要很長時間,您可能需要考慮使用任務。

+0

是的,我知道我將不得不以編程方式做到這一點,但我似乎無法找到如何做this.There任何文檔上刪除實體,但不是從刪除值一個列表。是一個鍵還是一個字符串。官方文檔只是說:「更新重複屬性時,您可以爲其分配一個新列表或者對現有列表進行變更,當您分配一個新列表時,列表項的類型將立即生效。」 –

+0

這是python。這只是一個列表。使用標準列表方法刪除或重新分配列表的內容,例如'pop()'。我建議你閱讀列表上的python文檔。 –

+0

好的,謝謝。我會這麼做的。 –