我知道我可以在保存模型实例时覆盖或定义pre_save, save, post_save来做我想做的事情。
在哪种情况下,哪一种是首选的?为什么?
发布于 2013-07-15 23:38:33
我会尽量用一个例子来解释:
pre_save和post_save是模型发送的signals。简而言之,就是在调用模型的save之前或之后执行的操作。
A save triggers the following steps
Django确实提供了一种覆盖这些信号的方法。
现在,
在实际保存到数据库之前,pre_save信号可以被覆盖以进行一些处理-示例:(我不知道在我的头顶哪个地方pre_save是理想的)
假设你有一个ModelA,它存储了对ModelB的所有对象的引用,这些对象还没有编辑过和。为此,您可以在调用ModelB的save方法之前注册一个pre_save信号来通知ModelA (在这里也可以注册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信号,该信号创建一个与系统中的每个User相对应的UserProfile对象。
信号是保持事物模块化和显式的一种方式。(如果我save或更改了ModelB中的某些内容,请显式通知ModelA )
为了更好地回答这个问题,我将考虑更具体的现实世界的例子。同时,我希望这对你有帮助
发布于 2016-10-06 18:03:50
不要忘记递归风险。如果在instance.save()调用中使用post_save方法,而不是.update方法,则应断开post_save信号:
Signal.disconnect(receiver=None,sender=None,dispatch_uid=None)源要断开接收器与信号的连接,请调用Signal.disconnect()。参数如Signal.connect()中所述。如果接收器断开连接,则该方法返回True,否则返回False。
receiver参数指示要断开连接的已注册接收器。如果使用dispatch_uid来标识接收方,则可能为None。
..。然后再连接一次。
()方法不发送pre_和post_信号,请记住这一点。
发布于 2013-07-15 10:19:14
pre_save它在事务保存之前使用。
post_save它在事务保存后使用。
例如,如果您有一个FileField或ImageField,并查看file或image是否真正存在,则可以使用pre_save。
当你有一个UserProfile,并且你想在创建新的User时创建一个新的,你可以使用post_save。
https://stackoverflow.com/questions/17645801
复制相似问题