Ani*_*nda 2 python django django-models django-rest-framework django-simple-history
所以我正在使用django-simple-history模块,该模块跟踪Model实例中的更改。但是,它使用post_save信号来这样做。在我的项目中,我还需要它在update()上触发。
我的问题是:如何覆盖update()方法以触发post_save信号?
通过这样做,您将遇到的问题是.update()不必为了执行其操作而从数据库中加载对象。考虑具有100万行的用户表上的以下示例:
users = User.objects.filter(date_joined__lte=now() - timedelta(days=30)
users.update(is_active=False)
Run Code Online (Sandbox Code Playgroud)
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数千次,每行一次,然后发送信号。这会降低性能。
如果您确实想使用信号,则需要从数据库中加载对象,对其进行迭代并一次保存一个。不幸的是,这没有办法。
| 归档时间: |
|
| 查看次数: |
2234 次 |
| 最近记录: |