You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 21:45:14