"级联删除"在GAE,NDB,Python应用程序上

时间:2016-04-23 00:35:56

标签: python google-app-engine google-cloud-datastore app-engine-ndb non-relational-database

我有一个使用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()

1 个答案:

答案 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