【问题标题】:Peewee How do i call post_delete signal for dependencies?Peewee 我如何为依赖项调用 post_delete 信号?
【发布时间】:2019-08-12 11:40:26
【问题描述】:

我看到 peewee 有信号 http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#signals

但它只适用于delete_instance()

出于我希望是显而易见的原因,Peewee 信号在以下情况下不起作用 您使用 Model.insert()、Model.update() 或 Model.delete() 方法。 这些方法生成执行超出范围的查询 ORM,并且 ORM 不知道哪些模型实例可能或 查询执行时可能不会受到影响。

信号通过挂钩到更高级别的 peewee API 来工作,例如 Model.save() 和 Model.delete_instance(),其中受影响的模型 实例是提前知道的。

那么,我如何在依赖的记录上使用信号,因为它在依赖上使用delete()

def delete_instance(self, recursive=False, delete_nullable=False):
        if recursive:
            dependencies = self.dependencies(delete_nullable)
            for query, fk in reversed(list(dependencies)):
                model = fk.model
                if fk.null and not delete_nullable:
                    model.update(**{fk.name: None}).where(query).execute()
                else:
                    model.delete().where(query).execute()
        return type(self).delete().where(self._pk_expr()).execute()

【问题讨论】:

    标签: foreign-keys hook peewee cascading-deletes


    【解决方案1】:

    简短的回答是不能,因为递归删除是使用以下形式的查询实现的:

    DELETE FROM ... WHERE foreign_key_id = X
    

    例如,假设您有一个用户,他们创建了 1000 条推文。 tweet.user_id 指向 user.id。当您删除该用户时,peewee 会发出 2 个查询:

    DELETE FROM tweets WHERE user_id = 123
    DELETE FROM users WHERE id = 123
    

    如果调用delete_instance(),您最终会发出 1001 个查询。所以希望很清楚为什么以这种方式实现它。

    我建议,如果您要删除行并且需要对相关行执行某种清理,那么您最好进行软删除(例如,设置 @987654324 @)。然后处理信号 API 之外的任何关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多