我已经阅读了所有相关问题。
我有两个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.py
或views.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
之外,反之
我在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”变成…