如何调用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)
关键说明
- 单条删除逻辑:
delete_model方法会在Admin中删除单个补货条目时触发,先完成对应商品的库存扣减,再执行默认的删除操作。 - 批量删除逻辑:
delete_queryset方法处理Admin中批量选中删除的场景,遍历所有待删除条目,逐个完成库存扣减后再执行批量删除。 - 库存负数防护:代码中添加了库存扣减后为负数的判断,自动将库存设为0,可根据实际业务需求调整(比如抛出错误提示阻止删除)。
- 补充修改场景处理:原
save_model方法仅覆盖新增场景,补充了修改补货条目时的库存计算逻辑——先减去原补货数量,再加上新数量,避免库存统计错误。
内容的提问来源于stack exchange,提问作者joyce
相关产品推荐
相关产品推荐

