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

Django实现保存前将quantity字段输入值转换为负数存入数据库

Django 实现quantity字段自动存为负数的方案

这里有三种不同层级的实现方式,你可以根据自己的业务场景选择:

  • 方案1:模型层全局处理(最推荐)
    重写模型的save方法,不管是表单提交、后台admin操作、还是其他接口写数据,都会自动转换quantity为负数,不会漏逻辑:
    修改你的models.py代码如下:
from django.db import models
from django.utils.timezone import now

class Receives(models.Model):
    date = models.DateField(default=now)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # 注意原代码default是字符串'0',IntegerField建议用数字类型默认值,避免类型异常
    quantity = models.IntegerField(default=0, blank=True, null=True)

    def save(self, *args, **kwargs):
        # 先取绝对值再取负,不管输入正负数最终都转为负数
        if self.quantity is not None:
            self.quantity = -abs(self.quantity)
        super().save(*args, **kwargs)

改完之后不需要调整视图和表单代码,原有逻辑正常运行即可。

  • 方案2:表单层处理
    如果只有这个ReceiveForm提交的数据需要转负数,其他场景不需要,可以修改表单的字段校验逻辑,在forms.py的ReceiveForm类中新增如下方法:
def clean_quantity(self):
    quantity = self.cleaned_data.get('quantity')
    if quantity is not None:
        return -abs(quantity)
    return quantity
  • 方案3:视图层临时处理
    如果仅需要在当前这个视图的提交逻辑里转负数,其他场景都不需要,可以修改views.py的保存逻辑,先拿暂存实例修改字段再写入数据库:
def post(self, request):
    receiveform = ReceiveForm(request.POST or None)
    stockform = StockForm(request.POST or None)
    if request.method == 'POST':
        if receiveform.is_valid() and stockform.is_valid():
            # commit=False表示先不写入数据库,拿到实例对象
            receive_inst = receiveform.save(commit=False)
            if receive_inst.quantity is not None:
                receive_inst.quantity = -abs(receive_inst.quantity)
            receive_inst.save()
            stockform.save()
            messages.success(request,'Data save successfully')
            return redirect('dashboard')
        else:
           print(receiveform.errors)
    context = {
      'receiveform':receiveform,
      'stockform':stockform,
    }
    return render(request, 'storesapp/receives.html', context)

提示:如果没有特殊的场景限制,优先选方案1,维护成本最低,不会出现逻辑遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:15:03