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


83

我在任何地方都找不到它,所以您的帮助对我非常有用:)这是该字段:

categories = models.ManyToManyField(fragmentCategory)

FragmentCategory:

class fragmentCategory(models.Model):

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

        name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)

这是发送的表格:

<input type="checkbox" name="val1" />
<input type="checkbox" name="val2" />
<input type="checkbox" name="val3" />

我尝试过这样的事情:

categories = fragmentCategory.objects.get(id=1),

要么:

categories = [1,2]

Answers:


141

Django文档的整个页面都专门针对此内容,并从内容页面进行了索引。

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

my_obj.categories.add(fragmentCategory.objects.get(id=1))

要么

my_obj.categories.create(name='val1')

14
然后,您需要致电my_obj.save()以保存更新还是自动完成?
CpILL

4
@CpILL似乎是自动完成的。在中试用python manage.py shell
瑞奇(Rikki)


3
@mehdi您只需在首次创建具有多对多字段的对象时调用save,以便它获得主键。之后的行为是您可以添加而不保存。
YungGun

4

万一别人两端在这里苦苦定制管理表单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

(将传入的QuerySet转换为列表是可以的-ManyToManyField还是可以的。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.