Django中创建含ManyToMany字段的模型实例时如何关联主键数组
问题根源
- Django 中操作 ManyToMany 类型字段时,必须先保存主模型实例生成主键,才能进行关联操作,无法直接在实例化主模型时传入多对多字段的值完成关联
.set()是批量设置多对多关联的正确方法,调用时机需要放在主实例保存之后
修正后代码
def create_student(request): """API for creating a student""" if request.method == "POST": PUT = json.loads(request.body) # 实例化时移除modules参数,不直接赋值多对多字段 student = Student( name=PUT['name'], join_date=PUT['join_date'], academic_year=PUT['academic_year'] ) # 先保存学生实例,生成主键 student.save() # 调用set方法关联模块,支持直接传入主键数组 student.modules.set(PUT['modules']) return JsonResponse(student.to_dict()) return HttpResponseBadRequest("Invalid method")
补充说明
.set()方法会先清空该字段原有的关联关系,再插入新传入的关联,符合新建实例时直接绑定指定模块的需求- 如果需要增量添加关联,可以使用
.add()方法,同样支持直接传入主键或者模型实例 - 建议在调用
.set()前增加参数校验逻辑,校验PUT['modules']是否为合法的主键数组,避免出现关联不存在的模块报错 - 如果需要保证学生创建和模块关联的操作原子性,可以用Django事务包裹整个逻辑,避免出现学生创建成功但模块关联失败的脏数据
内容的提问来源于stack exchange,提问作者Alexander Earl
相关产品推荐
相关产品推荐

