Django空表获取自增tax_id报NoneType错误 无数据时默认显示1
报错原因
当Tax_Settings表没有任何数据时,Tax_Settings.objects.last()的返回值是None,直接链式调用.tax_id就会触发'NoneType' object has no attribute 'tax_id'错误。
修复方法
在所有获取最后一条记录的位置增加空值判断,表为空时默认ID从1开始计数即可,修改后的views.py代码如下:
def tax_settings(request): # 空表默认初始ID为1,有数据时取最后一条记录的tax_id+1 last_record = Tax_Settings.objects.last() latest_id = last_record.tax_id + 1 if last_record else 1 if request.method == 'POST': name = request.POST['tax_name'] tax_percentage = request.POST['tax_percentage'] # create方法自带写入数据库逻辑,无需额外调用save() Tax_Settings.objects.create(tax_id=latest_id, name=name, tax_percentage=tax_percentage) # 新增完成后重新计算下一个ID,同样加空判断兜底 new_last = Tax_Settings.objects.last() next_id = new_last.tax_id + 1 if new_last else 1 return render(request, "settings/tax-settings.html", {"latest_id": next_id}) return render(request, "settings/tax-settings.html", {"latest_id": latest_id})
原有HTML模板代码不需要修改,传入的latest_id在空表场景下会默认显示1。
注意事项
- 手动计算自增ID存在并发冲突风险:如果两个用户同时提交请求,可能读到相同的latest_id,最终生成重复的tax_id。生产环境更推荐直接将
tax_id设置为模型的自增主键(AutoField/BigAutoField),由数据库层面保证ID唯一且自增,不需要业务代码手动计算。 - 原代码中
create()方法执行后已经完成了数据落库,不需要再额外调用.save()方法,属于冗余操作。
内容的提问来源于stack exchange,提问作者Shweta Shinde
相关产品推荐
相关产品推荐

