如何将数据添加到ManyToMany字段?

IPr*_*ory 64 django django-models

我无法在任何地方找到它,所以你的帮助对我来说很好:)这是这个领域:

categories = models.ManyToManyField(fragmentCategory)
Run Code Online (Sandbox Code Playgroud)

FragmentCategory:

class fragmentCategory(models.Model):

        CATEGORY_CHOICES = (
                        ('val1', 'value1'),
                        ('val2', 'value2'),
                        ('val3', 'value3'),
                        )

        name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)
Run Code Online (Sandbox Code Playgroud)

这是要发送的表单:

<input type="checkbox" name="val1" />
<input type="checkbox" name="val2" />
<input type="checkbox" name="val3" />
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情:

categories = fragmentCategory.objects.get(id=1),
Run Code Online (Sandbox Code Playgroud)

要么:

categories = [1,2]
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 115

有一整页Django文档专门用于此,从内容页面索引.

如该页面所述,您需要执行以下操作:

my_obj.categories.add(fragmentCategory.objects.get(id=1))
Run Code Online (Sandbox Code Playgroud)

要么

my_obj.categories.create(name='val1')
Run Code Online (Sandbox Code Playgroud)

  • 那么你需要调用`my_obj.save()`来保存更新还是自动完成? (10认同)
  • @CpILL似乎是自动完成的.在`python manage.py shell`中试试吧. (4认同)
  • @mehdi您只需要在第一次创建具有多对多字段的对象时调用 save ,以便它获得主键。之后的行为是您可以添加而不保存。 (4认同)

Chr*_*ris 5

如果其他人最终在这里努力自定义管理表单 Many2Many 保存行为,您不能调用self.instance.my_m2m.add(obj)您的ModelForm.save覆盖,因为ModelForm.save稍后填充您的 m2m,self.cleaned_data['my_m2m']从中覆盖您的更改。而是调用:

my_m2ms = list(self.cleaned_data['my_m2ms'])
my_m2ms.extend(my_custom_new_m2ms)
self.cleaned_data['my_m2ms'] = my_m2ms
Run Code Online (Sandbox Code Playgroud)

(可以将传入的 QuerySet 转换为列表 -ManyToManyField无论如何都会这样做。)