Django使用.save()方法保存数据时触发category_id为空的IntegrityError如何解决
错误原因定位
当前抛出的IntegrityError: category_id非空约束失败,核心是给任务绑定分类的取值路径完全错误,代码里还存在多处连带逻辑缺陷,按以下步骤修复即可解决:
1. 直接修复触发当前报错的代码
你在createtask视图里的分类ID取值逻辑存在两个问题:
- 你试图从
request.POST里取categories_pk,但这个值是URL路由传递给视图的路径参数,并不会出现在表单提交的POST数据里,取值永远为None,直接导致category_id为空触发数据库约束报错。 - 代码中给
newtask绑定user属性的操作无效:你定义的tasks模型根本没有user字段,这行代码和模型结构不匹配。
对应修正后的createtask视图代码如下:
@login_required def createtask(request, categories_pk): # 先校验分类归属,避免越权操作其他用户的分类 current_category = get_object_or_404(categories, pk=categories_pk, user=request.user) if request.method == 'GET': return render(request, 'user/createtask.html', {'form': TaskForm(), 'current_category': current_category}) else: try: form = TaskForm(request.POST) new_task = form.save(commit=False) # 直接绑定查询到的分类对象,Django会自动匹配对应的category_id new_task.category = current_category new_task.save() return redirect('currenttask') except ValueError: return render(request, 'user/createtask.html', {'form': TaskForm(), 'error': 'Bad data passed in. Try again.'})
2. 修复其余会触发后续报错的逻辑缺陷
以下问题在当前报错解决后会依次触发,可同步修正:
viewcategory视图的POST分支编辑逻辑错误:代码里写的是form = CategoriesForm(request.POST, instance=user),把登录用户对象当成了要编辑的分类实例,应该替换为之前查询到的分类对象categ,即form = CategoriesForm(request.POST, instance=categ)。- 重复定义的
task视图表单初始化错误:代码中把空的模型类tasks直接作为instance参数传给表单,这是完全错误的用法。新建任务场景下不需要给表单传模型实例,直接初始化TaskForm(request.POST)即可。 currenttask视图的查询逻辑完全不匹配模型关系:
错误写法为:
tasks = task.objects.filter(categories=request.user.category) return render(request, 'user/currenttask.html', {'categories':categ})
修正后的查询逻辑应该通过外键关联穿透查询当前用户所有分类下的任务,即:
@login_required def currenttask(request): user_tasks = tasks.objects.filter(category__user=request.user) return render(request, 'user/currenttask.html', {'task_list': user_tasks})
内容的提问来源于stack exchange,提问作者Ashwini Doddamani
相关产品推荐
相关产品推荐

