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

官方推荐

将信号处理器定义在关联 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

Django Signal 代码布局的更多相关文章

  1. Django之代码风格

    1 代码风格 稍微关注一下下面这些代码标准风格指导规则将会对你大有益处,我们高度建议你通读词章,即便你此时可能正想跳过它. 1.1 让你的代码保持可读性的重要性 代码在读方面的重要性胜过写.一个代码块 ...

  2. 【转】一个DIV+CSS代码布局的简单导航条

    原文地址:http://www.divcss5.com/shili/s731.shtml 简单的DIV CSS代码布局实现导航条 一个蓝色主题的导航条布局案例,本CSS小实例,采用DIV CSS实现. ...

  3. android 代码布局 记录

    1.概述 android 中大部分ui 布局是用xml 进行的,但是用代码布局调整是不可避免的.自己比较喜欢写模版,有些时候子类再继承模版时,往往有一些ui上的调整,又懒得去重写一个xml,就偷懒用代 ...

  4. android TextView EditTextView一些技巧使用 (视图代码布局)

    android TextView 是最常用的控件 可以用作普通的显示,还可以用作有显示文字的按钮,用作有显示图片的图文组合 1. 图文组合 xml 中: <TextView android:id ...

  5. Android 使用纯Java代码布局

    java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...

  6. Object-C iOS纯代码布局 一堆代码可以放这里!

    前言: 最近写的文章都是创业类,好吧,今天好好写写技术类的文章! 不过分享的不是IOS相关的文章,毕竟这几天在速成IOS,看的是object-c,由于速成的很快,好累! 好在现在基本已经入了点门道了, ...

  7. 002.[python学习]python编码规范pep8学习——PEP8第一部分代码布局

    关于PEP8的详细说明可以参考官方原文:http://legacy.python.org/dev/peps/pep-0008/ 我参考官方文档及其他文章,摘出相关内容而得此文章,具体参考其他文章见文中 ...

  8. Objective-C iOS纯代码布局 一堆代码可以放这里!

    前言: 最近写的文章都是创业类,好吧,今天好好写写技术类的文章! 不过分享的不是IOS相关的文章,毕竟这几天在速成IOS,看的是objective-c,由于速成的很快,好累! 好在现在基本已经入了点门 ...

  9. Django 基模板布局设置

    Django 基模板布局设置 基模板 定义基础模板一般分为三块,css部分,body部分,js部分 将基础统一的部分写在基础模板中 差异部分直接 引用 {% block css %}{% endblo ...

随机推荐

  1. Kafka 快速起步

    Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 主要内容:1. kafka 安装.启动2. 消息的 ...

  2. tomcat 工作原理简析

    https://github.com/HappyTomas/another-tutorial-about-java-web/blob/master/00-08.md 在00-02.理解HTTP中给出了 ...

  3. 点滴积累【C#】---Highcharts图形统计

    效果: 思路: 后台获取数据!然后拼接为前台所要求的格式,再将拼接好的StringBuilder给了hidden控件! 然后前台获取JQuery获取Hidden的值,最后将值赋给图形! 代码: [前台 ...

  4. make——五谷杂粮

  5. NPOI 导出Excel图片 (网络)

    导出网络图片,需要将网络图片下载到本地或者内存流中,建议下载的时候使用缩略图: 高清图片效率慢: Uri uri = new Uri(imgPath); //imgPath :网络图片地址 WebRe ...

  6. linux学习笔记22---命令diff和diff3

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  7. java对象实现深复制的方法

    p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...

  8. Centos版本 32或64位查看命令

    [root@root nginx]# uname -a Linux root -.el6.x86_64 # SMP Fri Nov :: UTC x86_64 x86_64 x86_64 GNU/Li ...

  9. flutter开发目录

    1>环境 2>设计 3>登录 4>主页面 5>主页面明细 6>详情 7>商品明细 8>购物车 9>订单页 10>个人关于 11>搜索页

  10. CI框架中 日志输出方法log_message()只允许输出字符串解决方案

    1.修改CodeIgniter/index.php,添加如下: define('ROOTDIR',dirname(__FILE__).'/'); 2.修改CodeIgniter/application ...