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

Django校园电商项目提交评论报错:NOT NULL约束失败(user_id字段)

问题分析与解决方案

核心错误原因

报错NOT NULL constraint failed: products_reviewrating.user_id是因为更新已有评论的逻辑中,创建的newreview对象未设置user字段,保存时触发数据库非空约束。

看你try块内的代码:

reviews = ReviewRating.objects.filter(user=request.user.userprofile, product=product).first()
form = ReviewForm(request.POST, instance=reviews)
newreview = form.save(commit=False)
newreview.product = product
newreview.save()  # 此处user字段为空,触发错误

即便用instance=reviews初始化表单,若reviews为None(即无已有评论),form.save(commit=False)生成的newreview不会自动填充user字段,直接保存就会触发约束错误。

修复后的视图代码

def submit_review(request, product_id):
    print(f'product_id: {product_id}')
    url = request.META.get('HTTP_REFERER')
    if request.method == 'POST':
        product = Product.objects.get(id=product_id)
        user_profile = request.user.userprofile
        try:
            # 精准查找用户对该商品的已有评论
            reviews = ReviewRating.objects.get(user=user_profile, product=product)
            form = ReviewForm(request.POST, instance=reviews)
            form.save()  # 直接保存更新,无需额外操作
            messages.success(request, 'Thank you! Your review has been updated')
        except ReviewRating.DoesNotExist:
            form = ReviewForm(request.POST)
            if form.is_valid():
                newreview = form.save(commit=False)
                newreview.product = product
                newreview.user = user_profile
                newreview.ip = request.META.get('REMOTE_ADDR')
                newreview.save()
                messages.success(request, 'Thank you! Your review has been submited.')
        return redirect(url)

关键修改说明

  • 简化更新逻辑:直接调用form.save()保存已有评论的修改,避免重复创建对象的冗余操作。
  • 强制关联user字段:创建新评论时明确绑定user_profile,确保user_id不为空。
  • 修正异常触发条件:将filter(...).first()改为get(),只有当评论不存在时才会触发DoesNotExist异常,逻辑更准确。

评论未在Django Admin显示的解决方法

  1. 检查模型注册:确保admin.py中已注册ReviewRating模型:
from django.contrib import admin
from .models import ReviewRating

admin.site.register(ReviewRating)
  1. 配置__str__方法:若已注册仍不显示,在models.py的ReviewRating模型中添加:
def __str__(self):
    return f"{self.user} - {self.product}"
  1. 自定义Admin显示(可选):让评论信息在Admin中更清晰:
class ReviewRatingAdmin(admin.ModelAdmin):
    list_display = ('user', 'product', 'rating', 'subject', 'created_at')
    list_filter = ('product', 'rating')

admin.site.register(ReviewRating, ReviewRatingAdmin)

内容的提问来源于stack exchange,提问作者Cyborg sonny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:15:10