Як додати дані в поле 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]

Відповіді:


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.
Ріккі

1
як цей документ вам потрібно зателефонувати .збережіть теж: docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/…
mehdi

4
@mehdi Вам потрібно зателефонувати лише при першому створенні об'єкта з полем багато до багатьох, щоб він отримав первинний ключ. Після цього поведінка така, що ви можете додавати, не зберігаючи.
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це все одно робить.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.