我有一个使用NDB数据存储和python的GAE应用程序,它为员工分配任务。我有任务实体和员工实体,它们有任务数组(存储任务'键)。我正在尝试实现一个"级联删除"在哪里我可以通过我的删除功能删除任务的关键,并让它"级联"员工实体清理对该任务的引用。现在我的删除任务功能工作正常,但它没有正确级联。当我删除任务并检查已分配该任务的员工时,其键值仍会显示。我非常感谢任何人都可以提供的任何指示!
我的实体定义位于db_models文件中,其中Task实体(仅由名称作为字符串组成)和具有任务数组的Employee实体:
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
我的删除功能,我通过'做了'或要删除的任务实体的密钥
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 :(得分: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