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]

回答:


141

これに特化したDjangoドキュメントのページ全体があり、目次ページから十分に索引付けされています。

そのページが述べているように、あなたはする必要があります:

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

または

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

14
次にmy_obj.save()、更新を保存するために呼び出す必要がありますか、それともこれは自動的に行われますか?
cpILL 2017年

4
@CpILLは自動的に行われるようです。で試してみてくださいpython manage.py shell
rikki 2017年

1
このdocとしてあなたも.SAVEを呼び出す必要が:docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/...を
メフディ

3
@mehdi主キーを取得するために、多対多フィールドを持つオブジェクトを初めて作成するときに、saveを呼び出すだけで済みます。その後の動作は、保存せずに追加できることです。
YungGun

4

他の誰かがここで管理フォームMany2Manyの保存動作をカスタマイズするのに苦労self.instance.my_m2m.add(obj)しているModelForm.save場合、ModelForm.save後でself.cleaned_data['my_m2m']変更を上書きする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ません-とにかくそうします。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.