当我学会使用Django signal时无比兴奋,正如大多数django开发者
新的开发人员得知django signal后会无比兴奋,很喜欢使用它.只要是能用它的地方就会用它,无意中身处坑底.为什么说是个坑呢?
问题¶
错误的用法:
大量使用django signal;
用signal处理大的进程;
导致: django项目越来越复杂; 项目效率越来越低;
原因¶
新鸟很容易认为signal是异步的. 其实django signal是同步的.
django signal的正确用法¶
- 尽量避免使用django signal(能用其他方法处理就用其他方法处理,如下)
- post_save和pre_save的逻辑可以考虑放在Model的save里
- 不要在pre_save里做数据验证.可以去自定义ModelForm的clean();也可以自己写一个validator
- 有些复杂的操作你可以用ModelManager来处理
- 给它异步的功能(如,与celery一起使用)
有些情况下不得不使用signal,如下:
- signal的receiver需要同事操作多个Model
- 清除cache时
- 无法使用其他方法替代signal时