python - Django 在更新时触发 post_save()

标签 python django django-models django-rest-framework django-simple-history

所以我正在使用 django-simple-history 模块来跟踪模型实例中的变化。但是,它使用 post_save 信号来执行此操作。在我的项目中,我还需要它在 update() 上触发。

我的问题是:如何覆盖 update() 方法来触发 post_save 信号?

最佳答案

这样做的问题是 .update()不必从数据库中加载对象来执行它的操作。考虑在具有 100 万行的用户表上的这个示例:

users = User.objects.filter(date_joined__lte=now() - timedelta(days=30)
users.update(is_active=False)

django 在这里做的不是从你的数据库中加载数十万行,只是为了设置 is_active为 False,然后单独保存每一行,而是发出 UPDATE直接通过数据库引擎命令:UPDATE users SET is_active=False WHERE date_joined < 30_DAYS_AGO .这是 Django 不触发 post_save 的唯一原因更新时:因为它首先没有从数据库加载任何内容。

为了触发信号,它需要从数据库中加载所有这些对象,发出数据库查询 UPDATE users SET is_active=False WHERE id=X数千次,每行一次,然后发送信号。这会降低性能。

如果你真的想使用信号,你需要从数据库中加载对象,遍历它们并一次保存一个。不幸的是,没有办法解决这个问题。

关于python - Django 在更新时触发 post_save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46915981/

相关文章:

python - 自动将键添加到 Python dict

Python 多处理 apply_async 不可pickle?

python - networkx - 根据边缘属性更改颜色/宽度 - 结果不一致

python - 修改其他列表定义的列表

python - Django Forms 在 ManyToMany 字段中保存 request.user

python - 有没有办法在没有index_together Meta选项的情况下定义多字段索引?

Django:我可以在另一个应用程序的子文件夹中拥有一个应用程序吗?

python - 构建 Django 测试 & 测试无法运行

django - 'ManyToManyField' 对象没有属性 'm2m_reverse_field_name'

Django:限制一对多关系中的关系数