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

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})

关键修改点

  1. 获取新旧数量并计算差值:先保存旧的quantity,再将新数量转换为整数,避免字符串类型错误。
  2. 事务包裹更新操作:使用transaction.atomic()保证Supplier和Stocks的更新操作原子性,防止数据不一致。
  3. 同步更新库存:根据差值调整Stocks的quantity,并添加库存非负校验(可根据业务需求调整)。
  4. 修复错误提示:将异常信息正确传递给用户,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:47:08