You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者박제현

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:42:20