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显示的解决方法
- 检查模型注册:确保
admin.py中已注册ReviewRating模型:
from django.contrib import admin from .models import ReviewRating admin.site.register(ReviewRating)
- 配置
__str__方法:若已注册仍不显示,在models.py的ReviewRating模型中添加:
def __str__(self): return f"{self.user} - {self.product}"
- 自定义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
相关产品推荐
相关产品推荐

