Django报'int' object has no attribute 'course'错误排查
报错产生原因
核心错误来自对Django ORM update()方法返回值的误解:
UserCourse.objects.filter(id=user_course_id).update(paid=True)是QuerySet的批量更新操作,该方法不会返回匹配到的模型实例,返回值是整数类型,代表本次更新成功影响的记录行数(匹配到1条有效记录时返回1,无匹配记录返回0)。- 后续代码执行
user_course.course时,相当于在整数对象上访问course属性,直接触发'int' object has no attribute 'course'报错。
代码里还存在两个会导致运行异常的隐藏问题:
student_profile变量没有提前查询赋值,运行到对应代码行会直接抛出NameError- 多对多关系字段调用
add()方法时会直接将关联关系写入数据库,不需要额外调用save()方法,原代码中多余的save操作无实际作用。
修复方案
先通过get()获取目标UserCourse实例,再修改字段值完成状态更新,同时补全购买用户profile的查询逻辑,删除冗余的save调用,增加不存在对应记录的异常兜底:
@require_http_methods(['GET', 'POST']) def payment_response(request, user_course_id=None): status=request.GET.get('status', None) tx_ref=request.GET.get('tx_ref', None) if status == "successful": if user_course_id: # 先查询对应记录,不存在直接返回失败页 try: user_course = UserCourse.objects.get(id=user_course_id) except UserCourse.DoesNotExist: return render(request, "payment/payment-failed.html") # 更新支付状态 user_course.paid = True user_course.save() # 获取课程创建者的profile实例 profile = Profile.objects.get(user=user_course.course.course_creator) # 补全购买用户的profile查询逻辑 student_profile = Profile.objects.get(user=user_course.user) # 绑定多对多关联关系 profile.my_students.add(user_course.user) student_profile.my_courses.add(user_course.course) return render(request, "payment/payment-success.html") else: return render(request, "payment/payment-failed.html") if status == "cancelled": return render(request, "payment/payment-failed.html")
如果你希望保留批量update的写法,需要注意update执行完后必须重新查询一次实例,才能访问实例上的关联字段,但是单条记录操作时直接用get()取实例再修改保存的写法更直观,也不容易踩返回值的坑。
内容的提问来源于stack exchange,提问作者Destiny Franks
相关产品推荐
相关产品推荐

