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

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']

验证修复

  1. 运行python manage.py makemigrations和python manage.py migrate,确保模型变更生效。
  2. 重新提交评论,此时应能正常完成提交/更新操作,不再出现FieldError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:01:51