post_save信号未调用 - python

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

我有两个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。

python大神给出的解决方案

什么时候解雇post_save?

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

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

什么时候不发射信号?

如果save方法未成功保存对象(例如,当IntegrityError发生时)
当您呼叫MyModel.objects.update()
当您覆盖save方法并忘记调用超类方法时。
信号接收器尚未成功注册时。

如何注册接收者

最简单的方法就是使用@receiver装饰器。替代方法是使用

from django.db.models.signals import pre_save

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

此代码应放在哪里?

如今,manual指出:

严格来说,信号处理和注册码可以生效
尽管您建议避免
应用程序的根模块及其模型模块以最小化
导入代码的副作用。

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

您可以在任何喜欢的地方放置信号处理和注册代码。
但是,您需要确保其所在的模块
尽早导入,以便在信号处理之前注册
任何信号都需要发送。这使您的应用的models.py成为一个不错的选择
放置信号处理程序注册的地方。

因此,如果您在注册信号接收器时遇到麻烦,则可以尝试将代码放入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 sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

PyCharm中Django的文档字符串中未解决的引用 - python

我在Django的专案中使用Google Style Python Docstrings like in this Example。当我创建一个类并在文档字符串中使用属性符号时,Pycharm总是说-“未解决的引用”。class Post(models.Model): """ Class for posts. Attribute…

如果django模型已经具有相关的类,如何将其转换为抽象模型 - python

可以说我有以下基本模型:class human(models.Model): gender = models.BooleanField() age = models.IntegerField() name = models.CharField(max_length=200) 还有两个继承它的模型:class superhero(human): can_fly…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…