Django项目额外数据声明与自定义模块开发最佳实践咨询
问题1 解答
针对你提到的两种场景,最佳实践核心逻辑是按数据的使用范围和属性分类存放,不要和环境配置混放:
- 供单个模型使用的选项列表:直接声明在模型类内部是官方推荐的做法,Django 3.0+ 更建议用内置的
TextChoices/IntegerChoices枚举类实现,类型提示和可读性更好。如果是同个app下多个模型共用的选项,可以抽出来放在对应app目录下的constants.py文件中。 - 供views使用的业务配置数据:不建议在函数/类内部大量声明,会导致代码冗余、修改成本高。
你提到的两种实现方式都不算是最优解:
- 方法1(存放在
settings.py):仅适合存放和部署环境相关的配置(比如第三方接口密钥、环境开关),纯业务静态数据往里塞会导致配置文件越来越臃肿,和项目耦合度过高,后期app复用的时候还要额外改全局配置,非常不推荐。 - 方法2(存根目录
data.py再导入settings):完全没必要多一层导入settings的逻辑,需要用的时候直接从data.py导入对应变量即可,但如果是单个app专用的数据,放在根目录会导致文件权责不清。
推荐的落地方式:
- 仅单个app使用的静态数据:在对应app目录下新建
constants.py存放,调用时直接from app1.constants import NBA_TEAMS - 跨多个app共用的全局静态数据:在项目根目录新建
global_constants.py统一存放,和环境配置做明确区分。
问题2 解答
这类通用工具类代码的存放核心原则是按复用范围归类,不要堆在views里:
- 如果校验规则仅给当前表单用:直接写在Form类的
clean_xxx方法中即可,这是Django表单原生支持的校验逻辑写法,不需要单独抽离函数。 - 如果校验函数需要在同个app内的多个表单/视图复用:在对应app下新建
validators.py文件存放所有自定义校验器,调用时用from app1.validators import validateUsername导入即可。 - 如果是跨app通用的校验逻辑:在项目根目录新建
validators.py或者utils.py统一存放,方便全局调用。
额外建议:你可以按照Django官方的自定义校验器规范来写函数(校验不通过时抛出ValidationError而非返回布尔值),写好的校验器不仅可以给views调用,还可以直接作为参数传入模型字段、表单字段的validators属性中,复用性更高。
内容的提问来源于stack exchange,提问作者Sadra
相关产品推荐
相关产品推荐

