Django提交评论报错:DateTimeField不支持'id'查找或关联查询
问题解决:Django评论提交的FieldError错误
问题分析
报错Unsupported lookup 'id' for DateTimeField的核心原因是:查询ReviewRating模型时,使用__id查询的某个字段是DateTime类型,而非关联其他模型的ForeignKey。结合代码来看,问题出在ReviewRating.objects.get(user__id=request.user.id, product__id=product_id)这行——要么user要么product字段在模型中被错误定义为DateTimeField,而非关联User/Product模型的外键。
另外代码中还有一个隐性错误:使用form.changed_data['subject']获取表单数据是错误的,changed_data是表单中被修改的字段名称列表,不是字典,无法通过键名取值,应该用form.cleaned_data获取验证后的合法数据。
解决步骤
1. 修正ReviewRating模型定义
确保user和product字段是ForeignKey类型,关联到对应模型:
# models.py from django.db import models from django.contrib.auth.models import User from store.models import Product # 假设Product在store应用下 class ReviewRating(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='reviews') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews') subject = models.CharField(max_length=100) rating = models.FloatField() review = models.TextField() ip = models.CharField(max_length=20) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.subject
2. 修正views.py代码
替换错误的form.changed_data为form.cleaned_data,同时优化查询写法(直接用user_id/product_id更简洁,避免字段类型错误隐患):
# views.py def submit_review(request, product_id): url = request.META.get('HTTP_REFERER') if request.method == 'POST': try: reviews = ReviewRating.objects.get(user_id=request.user.id, product_id=product_id) form = ReviewForm(request.POST, instance=reviews) form.save() messages.success(request, '感谢您的反馈!您的评论已更新。') return redirect(url) except ReviewRating.DoesNotExist: form = ReviewForm(request.POST) if form.is_valid(): data = ReviewRating() data.subject = form.cleaned_data['subject'] data.rating = form.cleaned_data['rating'] data.review = form.cleaned_data['review'] data.ip = request.META.get('REMOTE_ADDR') data.product_id = product_id data.user_id = request.user.id data.save() messages.success(request, '感谢您的反馈!您的评论已提交。') return redirect(url)
3. 验证表单定义
确保ReviewForm是基于ReviewRating模型的ModelForm,包含必要字段:
# forms.py from django import forms from .models import ReviewRating class ReviewForm(forms.ModelForm): class Meta: model = ReviewRating fields = ['subject', 'rating', 'review']
验证修复
- 运行
python manage.py makemigrations和python manage.py migrate,确保模型变更生效。 - 重新提交评论,此时应能正常完成提交/更新操作,不再出现FieldError。
内容的提问来源于stack exchange,提问作者user21225830
相关产品推荐
相关产品推荐

