Django后台新增Order记录时校验鞋子库存的业务逻辑应放在哪里?
订单新增库存校验逻辑的放置方案
你当前用的是Django框架,根据你需要的校验覆盖范围,有3种常用的实现位置:
【全局通用 优先选择】重写
Order模型的save()方法
不管是管理后台新增、API接口新增、还是脚本批量导入订单,只要调用订单的save方法就会触发校验,不会出现逻辑遗漏。
参考代码:from django.core.exceptions import ValidationError class Order(models.Model): # 此处保留你原本的字段定义:鞋子外键、购买数量、下单时间等 def save(self, *args, **kwargs): # 仅新增订单时校验,编辑订单可根据业务需求调整判断条件 if not self.pk: if self.shoes.stock < self.purchase_num: raise ValidationError(f"鞋子{self.shoes.title}库存不足,当前剩余库存:{self.shoes.stock}") # 校验通过后可直接在此处扣减库存 self.shoes.stock -= self.purchase_num self.shoes.save() super().save(*args, **kwargs)【仅管理后台生效 轻量实现】重写Order对应的Admin类的
save_model()方法
如果你只需要管控管理后台新增订单的场景,其他入口不需要校验,可以直接在admin.py里修改:
参考代码:from django.contrib import admin from django.contrib import messages from .models import Order @admin.register(Order) class OrderAdmin(admin.ModelAdmin): # 此处保留你原本的Admin配置:list_display、search_fields等 def save_model(self, request, obj, form, change): # change为False代表是新增订单场景 if not change: if obj.shoes.stock < obj.purchase_num: messages.set_level(request, messages.ERROR) messages.error(request, f"鞋子{obj.shoes.title}库存不足,无法创建订单") return # 扣减库存 obj.shoes.stock -= obj.purchase_num obj.shoes.save() super().save_model(request, obj, form, change)【低侵入 不推荐新手用】使用Django的
pre_save信号
如果你不想修改模型本身的代码,也可以通过监听订单保存前的信号做校验,但是逻辑会比较分散,后续维护成本更高,新手不优先考虑。
相关模型代码截图:
内容的提问来源于stack exchange,提问作者amir darvish
相关产品推荐
相关产品推荐

