Django模型重写save()方法提示缺少必填参数tran如何解决?
报错根因
- 调用save方法的方式错误:
Transactions.save(DATE,tran)是将实例方法作为类方法调用,你自定义的save第一个参数是self,必须接收Transactions实例对象,按你的写法,DATE被传给了self,tran被传给了D参数,导致tran形参没有传入值,直接触发参数缺失报错。 - 自定义save方法存在隐性bug:tran是字典类型,你写的
tran.SERVICE_CODE用了属性访问的写法,字典不支持该写法,后续会触发属性不存在报错;计算PERCENTAGE_TECH_DEC时用到的变量T未定义,运行也会报错。 - 调用父类save传参错误:Django原生Model的save方法不接收D、tran两个自定义参数,你尝试的
super(Transactions,self).save(D,tran)写法会触发参数不匹配报错。
修复方案
1. 修正视图层调用逻辑
不要直接调用类的save方法,先实例化Transactions对象再调用实例的save方法:
import datetime def fetch(): DATE = datetime.datetime.now() print(DATE) obj = wf() for tran in obj: print(tran) # 实例化模型对象 transaction = Transactions() # 调用实例的save方法 transaction.save(DATE, tran) return Transactions.objects.all()
2. 修正模型层save方法逻辑
修复字典取值错误、未定义变量问题,同时添加通用参数兼容Django原生save的能力:
def save(self, D, tran, *args, **kwargs): self.DATE = D # 字典改用中括号取值 self.TYPE = tran['SERVICE_CODE'] self.SUCCESS = tran['Success'] self.TECHNICAL_DECLINES = tran['Technical_declines'] self.BUSINESS_DECLINES = tran['Business_declines'] self.TOTAL = self.SUCCESS + self.TECHNICAL_DECLINES + self.BUSINESS_DECLINES # 替换未定义的T为技术拒绝数,添加除零判断避免报错 if self.TOTAL > 0: self.PERCENTAGE_TECH_DEC = (self.TECHNICAL_DECLINES / self.TOTAL) * 100 else: self.PERCENTAGE_TECH_DEC = 0 # 调用父类save时传入通用参数,兼容Django原生save的所有配置项 super(Transactions, self).save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Shankz
相关产品推荐
相关产品推荐

