Django中NOT NULL constraint failed: shop_review.item_id错误修复求助
修复 NOT NULL constraint failed: shop_review.item_id 错误
这个错误的核心原因很明确:你的Review模型里应该有一个关联Item的外键字段(数据库对应item_id列),但你创建Review对象时没有给这个必填字段赋值,触发了数据库的非空约束规则。
下面是具体的修复步骤:
1. 确保Review模型有正确的外键关联
首先检查你的models.py里的Review类(你没贴出这段代码,但根据错误可以推断),必须添加指向Item的外键。如果还没定义或定义有问题,修改成这样:
from django.db import models from .models import Item # 确保导入Item模型 class Review(models.Model): # 关键:添加关联Item的外键,on_delete根据业务需求选择,CASCADE表示删除Item时同步删除关联的Review item = models.ForeignKey(Item, on_delete=models.CASCADE) reviewText = models.CharField(max_length=200) # 存储你的userInfo内容 votes = models.CharField(max_length=300) # 存储你的userAddr内容 def __str__(self): return f"Review for {self.item.item_name}"
2. 修改views.py的创建逻辑,传递关联的Item对象
在你的order视图函数里,已经通过get_object_or_404(Item, pk=item_id)获取到了当前的item对象,创建Review时必须把这个对象传给外键字段:
def order(request, item_id): item = get_object_or_404(Item, pk=item_id) if request.method == "POST": username = request.user.username # 可以简化,无需先设为None userInfo = username + '/' + request.POST["nameNum"] userAddr = request.POST["address"] # 新增item=item参数,将当前商品与新创建的Review关联 new_review = Review.objects.create( item=item, reviewText = userInfo, votes = userAddr ) return HttpResponse("<script>alert('" + userInfo + '/ ' + userAddr + "');</script> 등록 완료") return render(request, 'order.html', {'item': item})
额外的小优化建议
- 你的
Item模型里的__str__方法写错了:是__str__(前后各两个下划线),不是__str___(多了一个下划线),修正后才能正确显示Item的名称:class Item(models.Model): def __str__(self): # 修正下划线数量 return self.item_name # 其他字段保持不变... - 字段命名尽量遵循Django的下划线命名惯例,比如把
reviewText改成review_text,votes改成user_address(因为你实际存的是地址),代码可读性会更好。 - 用
HttpResponse直接返回带JS的内容不太规范,建议使用Django的消息框架(messages)传递成功提示,然后重定向到商品详情页或订单列表页。
内容的提问来源于stack exchange,提问作者박제현
相关产品推荐
相关产品推荐

