Django 触发 post_save on update()
Django trigger post_save on update()
所以我正在使用 django-simple-history 模块来跟踪模型实例中的变化。但是,它使用 post_save 信号来这样做。在我的项目中,我还需要它在 update() 上触发。
我的问题是:如何覆盖 update() 方法来触发 post_save 信号?
这样做会遇到的问题是 .update()
不必从数据库中加载对象来执行它的操作。考虑具有 100 万行的用户 table 的这个示例:
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
数千次,每行一次,然后发送信号。这会降低性能。
如果你真的想使用信号,你需要从数据库中加载对象,遍历它们并一次保存一个。不幸的是,没有办法解决这个问题。
每当创建或更新 Django 模型对象时都会调用 save() 方法。
例如:
创建一个新的用户配置文件,
正在更新现有的用户配置文件。
对于这两种场景,我们都可以使用Django信号发送邮件通知用户。
为此,我们使用 Django 内置信号 post_save。
post_signal 将在 Django 模型实例上调用 .save() 时调度。
我们可以在models.py中使用下面的代码:
from django.db.models import signals
from django.dispatch import receiver
@receiver(signals.post_save, sender=Customer)
def on_create_or_updated_obj(sender, instance, **kwargs):
if kwargs['created']:
print 'obj created'
#send user created email to user
else:
print 'obj updated'
#logic for sending user updated email to user
所以我正在使用 django-simple-history 模块来跟踪模型实例中的变化。但是,它使用 post_save 信号来这样做。在我的项目中,我还需要它在 update() 上触发。
我的问题是:如何覆盖 update() 方法来触发 post_save 信号?
这样做会遇到的问题是 .update()
不必从数据库中加载对象来执行它的操作。考虑具有 100 万行的用户 table 的这个示例:
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
数千次,每行一次,然后发送信号。这会降低性能。
如果你真的想使用信号,你需要从数据库中加载对象,遍历它们并一次保存一个。不幸的是,没有办法解决这个问题。
每当创建或更新 Django 模型对象时都会调用 save() 方法。
例如: 创建一个新的用户配置文件, 正在更新现有的用户配置文件。
对于这两种场景,我们都可以使用Django信号发送邮件通知用户。
为此,我们使用 Django 内置信号 post_save。
post_signal 将在 Django 模型实例上调用 .save() 时调度。
我们可以在models.py中使用下面的代码:
from django.db.models import signals
from django.dispatch import receiver
@receiver(signals.post_save, sender=Customer)
def on_create_or_updated_obj(sender, instance, **kwargs):
if kwargs['created']:
print 'obj created'
#send user created email to user
else:
print 'obj updated'
#logic for sending user updated email to user