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

