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

Django中ProductRating.DoesNotExist错误原因及解决咨询

错误原因分析与修复方案

核心错误原因

你的代码中使用了 ProductRating.objects.get(...) 方法,而 Django 的 get() 方法在查询不到匹配记录时,不会返回 None,而是直接抛出 ProductRating.DoesNotExist 异常。当用户从未给目标商品评过分时,这行代码会直接触发异常,根本无法执行到后续的 if...else 判断逻辑,这就是你看到报错的直接原因。

额外潜在问题

除了上述核心错误,你的代码还有两处明显问题:

  • 创建新记录时缺少必填字段:ProductRating 模型中的 user 是必填外键,但你在 else 分支的创建逻辑里没有传入 user=request.user,会导致数据库插入失败。
  • 参数获取方式错误:评分值 grade 作为 POST 请求的业务参数,通常放在请求体中,应该从 request.data.get('grade') 获取,而不是从 URL 参数 kwargs['grade'] 取值。

修复后的代码示例

你可以通过两种方式解决 get() 方法的异常问题:

方式一:使用 filter().first() 替代 get()

filter().first() 在无匹配记录时会返回 None,不会抛出异常:

class PostRatingFromUser(generics.CreateAPIView):
    queryset = ProductRating.objects.all()
    permission_classes = [IsAdminOrAuthenticatedUser, ]
    serializer_class = ProductRatingSerializer

    def post(self, request, *args, **kwargs):
        rating_from_db = ProductRating.objects.filter(
            product_id=kwargs['pk'], 
            user=request.user
        ).first()
        
        grade = request.data.get('grade')
        if rating_from_db:
            rating_from_db.grade = grade
            rating_from_db.save()
        else:
            ProductRating.objects.create(
                product_id=kwargs['pk'], 
                user=request.user,
                grade=grade
            )
        return Response(status=200)

方式二:用 try-except 捕获异常

直接捕获 get() 抛出的异常,处理无记录的场景:

class PostRatingFromUser(generics.CreateAPIView):
    queryset = ProductRating.objects.all()
    permission_classes = [IsAdminOrAuthenticatedUser, ]
    serializer_class = ProductRatingSerializer

    def post(self, request, *args, **kwargs):
        grade = request.data.get('grade')
        try:
            rating_from_db = ProductRating.objects.get(product_id=kwargs['pk'], user=request.user)
            rating_from_db.grade = grade
            rating_from_db.save()
        except ProductRating.DoesNotExist:
            ProductRating.objects.create(
                product_id=kwargs['pk'], 
                user=request.user,
                grade=grade
            )
        return Response(status=200)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:25:05