gpt4 book ai didi

python - post_save信号未调用

转载 作者:行者123 更新时间:2023-12-03 13:26:16 24 4
gpt4 key购买 nike

我已经阅读了所有相关问题。

我有两个Django项目,信号在一个项目中可以正常工作,但在第二个项目中却不能工作(我只是复制粘贴代码并分别更改了名称)。

我有一个带有订单模型的订单应用。应用程序包含在INSTALLED_APPS设置中。

我在apps.py中有应用程序配置:

from django.apps import AppConfig


class OrdersConfig(AppConfig):
name = 'orders'

def ready(self):
super(OrdersConfig, self).ready()

# noinspection PyUnresolvedReferences
import signals
__init__.py:
default_app_config = 'orders.apps.OrdersConfig'

最后,signals.py:
@receiver(post_save, sender=Order)
def order_save(sender, instance, created, **kwargs):
print 'Post save'
if created:
print 'Created'
send_email_new_order.delay(settings.MODERATOR_EMAIL, instance.pk)

并且信号不会被调用。为什么?

Django 1.10.3。

最佳答案

什么时候解雇post_save?

文档说的是:save方法的末尾。

真正的含义:成功完成save方法后。

什么时候不发射信号?

  • 如果save方法未成功保存对象(例如发生IntegrityError时),则为
  • 调用MyModel.objects.update()
  • 当您重写save方法而忘记调用父类(super class)方法时。
  • 未成功注册信号接收器时。

  • 如何注册接收者

    最简单的方法就是使用 @receiver装饰器。替代方法是使用
    from django.db.models.signals import pre_save

    pre_save.connect(order_save, sender='app_label.MyModel')

    此代码应放在哪里?

    如今, manual指出

    Strictly speaking, signal handling and registration code can live anywhere you like, although it’s recommended to avoid the application’s root module and its models module to minimize side-effects of importing code.



    这可能就是为什么在这种情况下,您创建了一个名为Signals.py的文件,并将代码放在其中的原因,并且使AppConfig类和ready方法陷入了麻烦。但是有趣的是, Django 1.6 manual说:

    You can put signal handling and registration code anywhere you like. However, you’ll need to make sure that the module it’s in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app’s models.py a good place to put registration of signal handlers.



    因此,如果您在注册信号接收器时遇到麻烦,则可以尝试将代码放入 models.pyviews.py中,并忽略AppConfig中的位(甚至可以完全删除AppConfig)

    如果您想在AppConfig中进行注册,并且在使用 @reciever和/或导入时遇到问题,可以尝试
    from django.db.models.signals import pre_save
    from app_label.signals import my_reciever

    def ready(self):
    pre_save.connect(my_reciever, sender='app_label.MyModel')

    如何避免重复?

    信号是否发射两次?确保只注册一次接收器。如果您在 AppConfig中注册,请不要在 models.py中注册,反之

    关于python - post_save信号未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746137/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com