Django API中业务逻辑应放置在何处?
Django里的业务逻辑不是随便放的,得根据逻辑的类型和关联度来规划,下面是几种常用的规范做法:
模型层(
models.py):和数据直接绑定的逻辑优先放这里,比如数据的自定义校验、计算属性、单模型的操作封装。举个例子,用户模型里的密码加密逻辑、订单模型里的实付金额计算,都可以写成模型的方法或者@property装饰的属性。如果是批量数据操作的逻辑,还可以自定义模型管理器(Manager),封装在models.py里。服务层(
services.py):如果是跨多个模型的复杂业务流程,比如下单(要关联用户、商品、库存、订单四个模型)、退款流程,建议在对应app目录下新建services.py,把这些逻辑封装成独立的函数或类。比如写个create_user_order(user, product_list)函数,里面处理库存扣减、订单创建、发送通知等全流程,然后在视图里直接调用这个函数就行,视图只负责处理请求和响应。工具/辅助函数(
utils.py/helpers.py):一些通用的、不绑定特定业务的辅助逻辑,比如日期格式化、字符串处理、通用校验规则,可以放在app目录下的utils.py里,哪里需要就导入哪里。表单/序列化器(
forms.py/serializers.py):和输入数据验证、数据序列化相关的逻辑,比如前端提交的表单字段校验、API返回数据的格式处理,就放在这两个文件里,Django和DRF本身也推荐这种做法。
针对你说的想在apps目录下创建文件的想法,更合理的是给每个独立的app单独创建业务逻辑文件,而不是在apps根目录下建一个大文件。比如你的apps下有user、order这类子应用,就在user里建services.py处理用户相关的业务,order里建services.py处理订单业务,这样每个app的逻辑独立,符合Django的模块化思想。这些文件不需要特殊关联,只要在需要调用的地方(比如视图、模型)用from .services import xxx导入就行。
内容的提问来源于stack exchange,提问作者Paul

