Python post#U保存信号为';我没打电话
我已经阅读了所有相关的问题 我有两个Django项目,信号在其中一个项目中可以正常工作,但在第二个项目中不能工作(我只是分别复制了粘贴的代码和更改了名称) 我有一个订单应用程序与订单模式。应用程序包含在已安装的应用程序设置中 我在apps.py中有app config:Python post#U保存信号为';我没打电话,python,django,django-models,django-signals,Python,Django,Django Models,Django Signals,我已经阅读了所有相关的问题 我有两个Django项目,信号在其中一个项目中可以正常工作,但在第二个项目中不能工作(我只是分别复制了粘贴的代码和更改了名称) 我有一个订单应用程序与订单模式。应用程序包含在已安装的应用程序设置中 我在apps.py中有app config: from django.apps import AppConfig class OrdersConfig(AppConfig): name = 'orders' def ready(self):
from django.apps import AppConfig
class OrdersConfig(AppConfig):
name = 'orders'
def ready(self):
super(OrdersConfig, self).ready()
# noinspection PyUnresolvedReferences
import signals
\uuuu init\uuuuu.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.您是否绝对确定导入了正确的
信号?(print('hi,signals here')
在模块中?)
您可能也希望使用绝对合格的导入(导入订单.信号
)或相对的导入(导入.信号作为信号
)。您是否还有另一个应用程序也被命名为信号
在ready
方法中尝试相对导入:from。导入信号
何时启动post\u 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')
这个代码应该放在哪里?
如今,美国
严格地说,信号处理和注册码都可以使用
任何你喜欢的地方,尽管建议避免
要最小化的应用程序根模块及其模型模块
导入代码的副作用
这可能就是为什么在本例中,您创建了一个名为signals.py的文件,并将代码放在该文件中,而AppConfig类和ready方法遇到了所有这些问题。但有趣的是,报告说:
你可以把信号处理和注册码放在任何你喜欢的地方。
但是,您需要确保它所在的模块
尽早导入,以便在
任何信号都需要发送。这使你的应用程序的models.py成为一个很好的工具
放置信号处理程序注册的位置
因此,如果您在注册信号接收器时遇到问题,您可以尝试将代码放入models.py
或views.py
中,并从AppConfig中删除位(甚至可能完全删除AppConfig)
如果要在AppConfig中执行注册,并且在@receiver
和/或导入方面遇到问题,可以尝试
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
和vice-verceHm中删除,并用print检查,它会被调用两次-可以吗?这应该不是问题。尝试在模型末尾定义信号。如果将信号放入模型文件中,发送方是否为self?