我看到pre_save, save, post_save
当模型实例被保存时,我可以覆盖或定义做我想做的事情。
在哪种情况下首选哪一种,为什么?
我看到pre_save, save, post_save
当模型实例被保存时,我可以覆盖或定义做我想做的事情。
在哪种情况下首选哪一种,为什么?
我将尽力用一个例子来解释它:
pre_save
post_save
是模型发送的信号。简而言之,save
调用模型之前或之后要采取的行动。
Asave
触发以下步骤
Django 确实提供了一种方法来覆盖这些信号。
现在,
pre_save
在实际保存到数据库之前,可以覆盖信号以进行某些处理 - 示例:(我不知道一个很好的例子,说明哪里pre_save
最适合我的头脑)
假设您有一个ModelA
存储对尚未编辑的所有对象的ModelB
引用。为此,您可以在's方法被调用之前注册一个信号来通知(没有什么能阻止您在这里注册一个信号)。pre_save
ModelA
ModelB
save
post_save
现在,save
调用模型的方法(它不是信号) - 默认情况下,每个模型都有一个save
方法,但您可以覆盖它:
class ModelB(models.Model):
def save(self):
#do some custom processing here: Example: convert Image resolution to a normalized value
super(ModelB, self).save()
然后,就可以注册post_save
信号了(这个用的比较多pre_save
)
一个常见的用例是在系统中创建UserProfile
对象时创建User
对象。
您可以注册一个post_save
信号,该信号创建一个UserProfile
对应User
于系统中每个的对象。
信号是一种保持事物模块化和明确的方式。(明确通知ModelA
我save
或更改某些内容ModelB
)
为了更好地回答这个问题,我将考虑更具体的现实世界示例。同时,我希望这对你有帮助
不要忘记递归风险。如果您使用带有instance.save()调用的post_save方法,而不是 .update 方法,您应该断开您的post_save信号:
Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)[source] 要断开接收器与信号的连接,请调用 Signal.disconnect()。参数如 Signal.connect() 中所述。如果接收器断开连接,则该方法返回 True,否则返回 False。
接收器参数指示注册的接收器断开连接。如果 dispatch_uid 用于识别接收者,它可能是 None。
...然后再次连接。
update()方法不发送 pre_ 和 post_ 信号,请记住这一点。
pre_save
它在事务保存之前使用。
post_save
它在事务保存后使用。
pre_save
例如,您可以使用aFileField
或 anImageField
并查看 thefile
或 the是否image
真的存在。
post_save
当你有一个UserProfile
并且你想在创建一个新的时创建一个新的时,你可以使用User
它。