Django中编辑Supplier时Stocks数量未同步更新的问题求助
Django中编辑Supplier时同步更新Stocks库存的问题及解决
问题描述
在Django项目中,编辑Supplier模型的商品数据时,Stocks模型中的库存数量既不增加也不减少。需要实现:当编辑数据时,若新设置的quantity大于旧值,库存增加新旧数量的差值;若新数量小于旧值,库存减少该差值。
现有代码
models.py
# models.py from collections.abc import Collection from django.contrib.auth.models import User from django.db import models from django.core.exceptions import ValidationError class Client(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) mobile = models.CharField(max_length=15) address = models.CharField(max_length=255) def clean_mobile(self): mobile=self.mobile if len(str(mobile))!= 10: raise ValidationError("invalid mobile number") return mobile class Supplier(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) product_name = models.CharField(max_length=255) product_price = models.DecimalField(max_digits=10, decimal_places=2) image = models.ImageField(upload_to='products/') quantity= models.PositiveIntegerField(default=1) category=models.CharField(choices=CHOICES3,max_length=10) def __str__(self): return self.product_name CHOICES3 = [('Tshirt','Tshirt'),('Jeans','Jeans'),('Jacket','Jacket'),('Shoes','Shoes'),('Watch','Watch')] CHOICES2 = [('Polo-Tshirt','Polo-Tshirt'),('Levis-Jeans','Levis-Jeans'),('Denim-Jacket','Denim-Jacket'),('Puma-Shoes','Puma-Shoes'),('Titan-Watch','Titan-Watch')] class Stocks(models.Model): product_name = models.CharField(choices=CHOICES2,max_length=100) quantity = models.PositiveBigIntegerField(default=100) def __str__(self): return self.product_name
views.py
def supplier_dashboard(request): if request.method == 'POST': product_name = request.POST.get('product_name') product_price = request.POST.get('product_price') image = request.FILES.get('image') quantity = request.POST.get('quantity') category = request.POST.get('category') data = Supplier.objects.create(user=request.user, category=category, product_name=product_name, product_price=product_price, image=image, quantity=quantity) data.save() supplier = Supplier.objects.filter(user=request.user) return HttpResponseRedirect(reverse('update_stocks', args=[data.id])) else: supplier = Supplier.objects.filter(user=request.user) return render(request, 'enroll/supplier_dashboard.html', {'suppliers': supplier}) def supplier_edit(request,id): try: product=Supplier.objects.get(id=id) if product.user == request.user: if request.method=='POST': product.product_name = request.POST.get('product_name') product.product_price = request.POST.get('product_price') if 'image' in request.FILES: product.image=request.FILES.get('image') product.quantity = request.POST.get('quantity') product.category = request.POST.get('category') product.save() messages.success(request,"ProDuct Updated Succesfully") return redirect('supplier_dashboard') return render(request,'enroll/supplier_edit.html',{'products':product}) except Exception as e : messages.error(request," Some Error Occured ",e) return render(request,'enroll/supplier_edit.html',{'products':product}) def update_stocks(request, id): print("------------", id) product = Supplier.objects.get(id=id) stocks = Stocks.objects.get(product_name=product.product_name) print(product.quantity, stocks.quantity) stocks.quantity = stocks.quantity - product.quantity stocks.save() return HttpResponseRedirect(reverse('supplier_dashboard'))
问题分析
当前supplier_edit视图仅更新了Supplier模型的数据,没有计算新旧quantity的差值,也没有同步修改对应的Stocks记录,导致库存不会随编辑操作变化。此外,request.POST.get('quantity')返回的是字符串,直接赋值给product.quantity可能引发类型问题。
解决方案
修改supplier_edit视图,在更新Supplier前先获取旧数量,计算差值后同步更新Stocks:
from django.db import transaction # 导入事务保证数据一致性 def supplier_edit(request,id): try: product=Supplier.objects.get(id=id) if product.user == request.user: if request.method=='POST': # 先获取旧的数量值 old_quantity = product.quantity # 获取并转换新数量为整数 new_quantity = int(request.POST.get('quantity', old_quantity)) # 更新Supplier其他字段 product.product_name = request.POST.get('product_name') product.product_price = request.POST.get('product_price') if 'image' in request.FILES: product.image=request.FILES.get('image') product.quantity = new_quantity product.category = request.POST.get('category') # 计算差值,同步更新Stocks quantity_diff = new_quantity - old_quantity with transaction.atomic(): # 事务确保两个模型的更新要么都成功,要么都失败 product.save() # 找到对应商品的库存记录 stocks = Stocks.objects.get(product_name=product.product_name) stocks.quantity += quantity_diff # 确保库存不会为负数(根据业务需求调整) if stocks.quantity < 0: stocks.quantity = 0 stocks.save() messages.success(request,"产品更新成功") return redirect('supplier_dashboard') return render(request,'enroll/supplier_edit.html',{'products':product}) except Exception as e : messages.error(request,f"发生错误: {str(e)}") return render(request,'enroll/supplier_edit.html',{'products':product})
关键修改点
- 获取新旧数量并计算差值:先保存旧的
quantity,再将新数量转换为整数,避免字符串类型错误。 - 事务包裹更新操作:使用
transaction.atomic()保证Supplier和Stocks的更新操作原子性,防止数据不一致。 - 同步更新库存:根据差值调整Stocks的
quantity,并添加库存非负校验(可根据业务需求调整)。 - 修复错误提示:将异常信息正确传递给用户,方便排查问题。
内容的提问来源于stack exchange,提问作者Shivang Kant
相关产品推荐
相关产品推荐

