Как добавить данные в поле ManyToMany?

83

Нигде не могу найти, так что ваша помощь будет мне приятна :) Вот это поле:

categories = models.ManyToManyField(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]
IProblemFactory
источник

Ответы:

144

Там целая страница документации Django посвящена этому , хорошо индексируются страницы содержимого.

Как указано на этой странице, вам необходимо сделать:

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

или же

my_obj.categories.create(name='val1')
Дэниел Розман
источник
15
Вам тогда нужно позвонить, my_obj.save()чтобы сохранить обновление или это делается автоматически?
CpILL
4
@CpILL Похоже, выполняется автоматически. Попробуйте это в python manage.py shell.
Rikki
1
как этот документ вам нужно позвонить .save тоже: docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/...
Мехди
4
@mehdi Вам нужно вызвать save только в первый раз, когда вы создаете объект с полем многие ко многим, чтобы он получил первичный ключ. После этого вы можете добавить без сохранения.
YungGun
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

(Можно преобразовать входящий QuerySet в список - в ManyToManyFieldлюбом случае он это делает.)

Крис
источник