Django中使用form.save()保存数据时如何关联多对多关系?
解决方法
核心逻辑
Django的多对多字段必须绑定已存入数据库、拥有主键的实例才能操作,你的表单没有包含user多对多字段,因此需要在表单保存后手动关联对应数据,具体步骤如下:
- 第一步:保存
Person表单时接收返回的实例,方便后续给Dog的外键owner赋值 - 第二步:处理Dog表单时先调用
save(commit=False)得到未写入数据库的Dog实例,补充完外键等字段后先保存Dog实例,确保它有主键 - 第三步:调用多对多字段的
add()方法关联需要绑定的User实例
修正后的代码示例
def create(response): if response.method == "POST": if "next" in response.POST: form = CreateNewPerson(response.POST) # 接收保存后返回的Person实例 person = form.save() # 表单包含图片字段时必须传入FILES参数 form2 = CreateNewDog(response.POST, response.FILES) if form2.is_valid(): # 获取未写入数据库的Dog实例 dog = form2.save(commit=False) # 给外键owner赋值 dog.owner = person # 保存Dog实例到数据库,此时生成主键,可操作多对多字段 dog.save() # 关联User,示例为关联当前登录用户,多个User可传入列表 target_users = [response.user] # 替换为实际需要关联的User对象列表 dog.user.add(*target_users) class CreateNewDog(forms.ModelForm): class Meta: model = Dog fields = ['name','years_old', 'sex', 'blood_type', 'image'] class Dog(models.Model): owner = models.ForeignKey(Person, on_delete=models.SET_NULL, null=True) user = models.ManyToManyField(User)
补充说明
如果你的表单中包含了多对多字段的输入项,直接在form.save(commit=False)保存实例后,调用form.save_m2m()即可自动填充多对多关联,无需手动调用add()方法。
内容的提问来源于stack exchange,提问作者GreenOrbit
相关产品推荐
相关产品推荐

