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
相关产品推荐
相关产品推荐

