需要确保信号注册函数在使用前就被引入,所以理论上你可以将其置于满足上述条件的任意位置。

官方推荐

将信号处理器定义在关联 app 目录下的 signals.py 中,在关联 app 的 apps.AppConfig 下的 ready() 中使用注册函数或者引入带 @receiver 装饰器的处理器。

示例如下(strategy 是一个 app 名称):

strategy/signals.py:

def create_orders(sender, **kwargs):
pass @receiver(post_save)
def decorated_handler(sender, **kwargs):
pass

strategy/apps.py:

from django.apps import AppConfig
from django.db.models.signals import post_save
from strategy.signals import create_orders
from strategy.models import Strategy class StrategyConfig(AppConfig):
name = 'strategy' def ready(self):
# 注册
post_save.connect(create_orders, sender=Strategy)
# 或者引入带 `@receiver` 装饰器的处理器
from strategy.signals import decorated_handler

通过 connect 注册更好。原因是 from strategy.signals import decorated_handler 会被 IDE 提示为引入而未使用。

注意

  • 要在 ready() 内部而不能是外部引入其他的 model,否则会报错:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.,原因是只有在 ready() 中, 其他 model 才已经被定义好了
  • INSTALLED_APPS 中的 app 应该指向对应的 AppConfig 路径,只有这样 Django 才会调用对应 app 的 AppConfig 否则只是调用 AppConfig 基类:

default_app_config allows applications that predate Django 1.7 such as django.contrib.admin to opt-in to AppConfig features without requiring users to update their INSTALLED_APPS.

New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.[1]

放在 models.py

上面的放置方式与 models.py 的关联强度不够,所以这里将其放到 models.py 中。具体操作是:

  • 将信号处理器以 classmethod 的方式定义在对应的 model 中
  • 在 models.py 的最下方统一注册[2]

参考

  1. https://docs.djangoproject.com/en/2.0/ref/applications/#configuring-applications
  2. https://stackoverflow.com/a/2719664/5238892

最新文章

  1. jQuery的加法运算.
  2. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
  3. nodejs系列(二)REPL交互解释 事件循环
  4. 161027、Java 中的 12 大要素及其他因素
  5. memcached增删改查
  6. swift把汉字转换为拼音,并且截取首字母做索引用
  7. GDB调试技巧
  8. 6T GPT 移动硬盘在linux下的挂载
  9. android开发时间和日期的代码实现工具类(一)
  10. SQLserver查询数据类型为ntext是空或NULL值的方法
  11. MyEclipse 中 添加 js自动完成模版
  12. Zookeeper 快速入门(上)
  13. 使用docker redis-cluster集群搭建
  14. ul ol li的序号编号样式
  15. ssh和scp时指定端口
  16. easyui dialog 表单提交,弹框初始化赋值,dialog实现
  17. mysql 多表查询先排序,然后再取分组<mysql 先order by,然后再取group by分组>
  18. vue控制台报错
  19. Unity3D笔记 英保通九 创建数
  20. 【环境搭建】CDH版Hadoop环境搭建

热门文章

  1. python 去掉字符串的 "
  2. js setInterval()函数 [倒计时用]
  3. 电脑不识别USB blaster驱动问题
  4. C#实现的自定义IIS认证模块 转载
  5. 使用GitHub做个人博客
  6. Tomcat 学习进阶历程之Tomcat架构与核心类分析
  7. C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
  8. 李洪强iOS开发之iOS工具收集
  9. Vim 学习笔记二
  10. ubox及日志管理