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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:27:49