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

如何调用Django Admin删除函数同步扣减关联库存数量

Django Admin删除补货条目时同步扣减库存的实现方案

需求说明

已实现新增补货条目时自动将补货数量添加到stockList模型的库存中,但删除补货条目时,stockList的库存未同步扣减,需要通过Django Admin的删除逻辑完成该同步操作。

实现方案

在restockInfo这个ModelAdmin类中,重写单条删除方法delete_model和批量删除方法delete_queryset,在删除补货条目前后完成库存的扣减操作。

完整修改后的restockInfo代码

from django.contrib import admin
from django.contrib import messages
from .models import restockList

class restockInfo(admin.ModelAdmin):
    list_display = ["product", "delivery_order_no","restock_quantity", "supplier_name", "created_date"]
    readonly_fields = ["created_date"]
    search_fields = ['created_date']

    def save_model(self, request, obj, form, change):
        product = obj.product
        restock_quantity = obj.restock_quantity
        if restock_quantity and product.quantity_in_store:
            if restock_quantity >= 0:
                # 处理修改补货条目场景:先减去原数量再加新数量
                if change:
                    original_obj = restockList.objects.get(pk=obj.pk)
                    obj.product.quantity_in_store = product.quantity_in_store - original_obj.restock_quantity + restock_quantity
                else:
                    obj.product.quantity_in_store = product.quantity_in_store + restock_quantity
                obj.product.save()
                messages.success(request, 'Successfully added!')
                super().save_model(request, obj, form, change)
            else:
                messages.error(request, 'Invalid Quantity, Please Try Again!!!')
                return

    # 处理单条补货条目删除
    def delete_model(self, request, obj):
        if obj.product and obj.restock_quantity:
            # 扣减对应商品库存
            obj.product.quantity_in_store -= obj.restock_quantity
            # 防止库存变为负数,可根据业务调整逻辑
            if obj.product.quantity_in_store < 0:
                obj.product.quantity_in_store = 0
                messages.warning(request, f"{obj.product.product_name}库存扣减后为负数,已设为0")
            obj.product.save()
            messages.success(request, "库存已同步扣减")
        # 执行默认删除逻辑
        super().delete_model(request, obj)

    # 处理批量删除补货条目
    def delete_queryset(self, request, queryset):
        for obj in queryset:
            if obj.product and obj.restock_quantity:
                obj.product.quantity_in_store -= obj.restock_quantity
                if obj.product.quantity_in_store < 0:
                    obj.product.quantity_in_store = 0
                    messages.warning(request, f"{obj.product.product_name}库存扣减后为负数,已设为0")
                obj.product.save()
        messages.success(request, "批量删除完成,库存已同步扣减")
        # 执行默认批量删除逻辑
        super().delete_queryset(request, queryset)

admin.site.register(restockList, restockInfo)

关键说明

  1. 单条删除逻辑:delete_model方法会在Admin中删除单个补货条目时触发,先完成对应商品的库存扣减,再执行默认的删除操作。
  2. 批量删除逻辑:delete_queryset方法处理Admin中批量选中删除的场景,遍历所有待删除条目,逐个完成库存扣减后再执行批量删除。
  3. 库存负数防护:代码中添加了库存扣减后为负数的判断,自动将库存设为0,可根据实际业务需求调整(比如抛出错误提示阻止删除)。
  4. 补充修改场景处理:原save_model方法仅覆盖新增场景,补充了修改补货条目时的库存计算逻辑——先减去原补货数量,再加上新数量,避免库存统计错误。

内容的提问来源于stack exchange,提问作者joyce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:49:56