【问题标题】:Why does `post_save` signal get emitted on object creation along with object save?为什么在对象创建和对象保存时会发出“post_save”信号?
【发布时间】:2012-08-19 18:39:30
【问题描述】:

我遇到了post_save 被调用两次的问题,我花了很多时间来弄清楚前面提到的导入。我确认导入只发生一次,不存在多次注册的问题。此外,我在信号注册中使用了一个独特的dispatch_uid,根据文档应该已经解决了这个问题。它没。我更仔细地看了看,发现信号处理程序在 .create() 和 .save() 上都被调用了。为什么要创建?

我可以让它工作的唯一方法是依靠下面我的信号处理程序中的 hack

created = False

    #Workaround to signal being emitted twice on create and save
    if 'created' in kwargs:
        if kwargs['created']:
            created=True

    #If signal is from object creation, return
    if created:
        return

这是对问题Django post save signal getting called twice despite uid的后续跟进

【问题讨论】:

  • 大概你想要一个比“因为创建是实例化加保存”更好的答案?
  • @IgnacioVazquez-Abrams MyClass.objects.create(...) 与一般初始化 MyClass(...) 还是专门针对信号不同?我一直认为这两种创造方式是一样的,想知道为什么它不服从Note that instantiating a model in no way touches your database; for that, you need to save().

标签: python django django-models signals


【解决方案1】:

Because "creation" is instantiation plus saving.

create(**kwargs)

一种创建对象并将其全部保存的便捷方法。因此:

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")

和:

p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)

是等价的。

【讨论】:

  • 谢谢!我应该知道的,但必须下到信号才能弄清楚!
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多