首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候在django中使用pre_save,save,post_save?

什么时候在django中使用pre_save,save,post_save?
EN

Stack Overflow用户
提问于 2013-07-15 10:09:40
回答 3查看 23.8K关注 0票数 32

我知道我可以在保存模型实例时覆盖或定义pre_save, save, post_save来做我想做的事情。

在哪种情况下,哪一种是首选的?为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-15 23:38:33

我会尽量用一个例子来解释:

pre_savepost_save是模型发送的signals。简而言之,就是在调用模型的save之前或之后执行的操作。

A save triggers the following steps

  • 发出预保存信号。
  • 对数据进行预处理。
  • 大多数字段不做任何预处理-字段数据保持原样。
  • 为数据库准备数据。
  • 将数据插入到数据库中。
  • 发出保存后信号。

Django确实提供了一种覆盖这些信号的方法。

现在,

在实际保存到数据库之前,pre_save信号可以被覆盖以进行一些处理-示例:(我不知道在我的头顶哪个地方pre_save是理想的)

假设你有一个ModelA,它存储了对ModelB的所有对象的引用,这些对象还没有编辑过。为此,您可以在调用ModelBsave方法之前注册一个pre_save信号来通知ModelA (在这里也可以注册post_save信号)。

现在,模型的save方法(它不是一个信号)被调用-默认情况下,每个模型都有一个save方法,但您可以覆盖它:

代码语言:javascript
复制
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 )

为了更好地回答这个问题,我将考虑更具体的现实世界的例子。同时,我希望这对你有帮助

票数 35
EN

Stack Overflow用户

发布于 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_信号,请记住这一点。

票数 5
EN

Stack Overflow用户

发布于 2013-07-15 10:19:14

代码语言:javascript
复制
pre_save

它在事务保存之前使用。

代码语言:javascript
复制
post_save

它在事务保存后使用。

例如,如果您有一个FileFieldImageField,并查看fileimage是否真正存在,则可以使用pre_save

当你有一个UserProfile,并且你想在创建新的User时创建一个新的,你可以使用post_save

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17645801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档