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

Django REST:创建课程时如何获取MyCourse实例关联Session

问题与解决方案

问题场景

开发课程排期系统,课程(MyCourse)包含多个课时(Session)。创建课程时需根据请求参数class_count生成对应数量的空白课时,Session模型含指向用户Profile和MyCourse的外键。现有代码执行时出现类型错误,需获取刚创建的MyCourse实例。

现有代码

serializer.save(instructor=self.request.user)
for sess in range(int(request.POST.get('class_count'))):
     Session.objects.create(user=self.request.user.profile, session_active=True, course=request)
     Session.save()

报错信息

ValueError: Cannot assign "<rest_framework.request.Request: POST '/create/'>": "Session.course" must be a "MyCourse" instance.

解决方案

核心问题是serializer.save()方法会返回刚创建的MyCourse实例,只需将该实例保存到变量,再传入Session的外键字段即可:

修改后的基础代码

# 保存课程并获取刚创建的MyCourse实例
new_course = serializer.save(instructor=self.request.user)
# 获取请求中的课时数量
class_count = int(request.POST.get('class_count'))
# 循环创建对应数量的课时
for _ in range(class_count):
    Session.objects.create(
        user=self.request.user.profile,
        session_active=True,
        course=new_course  # 使用刚创建的MyCourse实例
    )

性能优化(批量创建)

如果class_count数值较大,推荐使用bulk_create减少数据库交互次数,提升效率:

new_course = serializer.save(instructor=self.request.user)
class_count = int(request.POST.get('class_count'))
# 构造所有Session对象列表
session_list = [
    Session(
        user=self.request.user.profile,
        session_active=True,
        course=new_course
    ) for _ in range(class_count)
]
# 批量创建并保存
Session.objects.bulk_create(session_list)

注意:Session.objects.create()已自动完成保存操作,无需额外调用Session.save()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:49:57