eug*_*ene 26 python django django-signals django-models
我看到我可以覆盖或定义pre_save, save, post_save
在保存模型实例时执行我想要的操作.
在哪种情况下哪一个首选?为什么?
kar*_*ikr 27
我将尽力用一个例子来解释它:
pre_save
并且post_save
是模型发送的信号.简单来说,save
调用模型之前或之后的操作.
A save
触发以下步骤
Django确实提供了一种覆盖这些信号的方法.
现在,
pre_save
在实际保存到数据库之前,可以覆盖信号进行某些处理 - 例如:(我不知道pre_save
在我的脑海中哪里理想的一个很好的例子)
比方说你有一个ModelA
存储引用的所有对象ModelB
已不被编辑呢.对于这一点,你可以注册一个pre_save
信号,通知ModelA
权利之前ModelB
s"的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()
Run Code Online (Sandbox Code Playgroud)
然后,你可以注册post_save
信号(这是更常用的pre_save
)
一个常见的用例是在系统中创建UserProfile
对象时创建User
对象.
您可以注册一个post_save
信号,该信号创建一个与系统中的UserProfile
每个对应的对象User
.
信号是保持模块化和显式化的一种方式.(ModelA
如果我save
改变了某些内容,请明确通知ModelB
)
为了更好地回答这个问题,我会想到更具体的现实世界的例子.同时,我希望这会对你有所帮助
pre_save
Run Code Online (Sandbox Code Playgroud)
它在交易保存之前使用。
post_save
Run Code Online (Sandbox Code Playgroud)
交易保存后使用。
pre_save
例如,您可以使用如果您有 aFileField
或 anImageField
并查看 thefile
或 the是否image
确实存在。
post_save
当您有一个UserProfile
并且您想在创建新的那一刻创建一个新的时,您可以使用它User
。
不要忘记递归风险。如果你使用post_save方法和instance.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_ 信号,记住这一点。