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
相关产品推荐
相关产品推荐

