DjangoのManyToMany(多対多)の保存

DjangoのManyToManyField(多対多)をフォームを通してDBに保存するのに苦労したのでメモ。

多対多を利用したモデルから生成したフォームを保存した時に、多対多のフィールドだけ全然保存されなかったので、「?」となっていたのですが、ドキュメントを探していたら書いてありました。

参考:モデルからフォームを生成する

モデルが他のモデルに対する多対多のリレーションをはっている場合、 commit=False を使うともう一つの副作用があります。多対多のリレーションを 持つモデルから生成したフォームを保存する際、 Django は多対多のリレーション に対するデータをすぐに保存できません。

あー...

つまり、

  1. commit=Falseを利用している
  2. 多対多が存在している

このパターンを満たす場合に、多対多の情報が保存されなくなります。

はい、バッチリ使ってました。で、解決方法は、

この問題を回避するために、Django は commit=False でフォームを保存した直 後に、モデルフォームクラス save_m2m() メソッドを追加します。フォームの から生成したインスタンスを手動で保存した後で save_m2m() を呼び出せば、 多対多のフォームデータを保存できます。

ということなので、save_m2m()を使います。

hoge_form = HogeForm(request.POST)

if request.method == 'POST':

hoge = hoge_form.save(commit=False)
# ~~~~~~
# ごにょごにょ色々やる
# ~~~~~~
hoge.save()
hoge_form.save_m2m() # ←これを追加

これで無事保存できました。

覚えておきます!

コメント

現在コメントはありません

新しいコメント

*
*
*

admin

こんにちは!Bicepperです。
メインはフロントですが、Python・AWS・GCPやったりと手を広げまくってます。

筋トレ歴10年目。筋トレのこともたまーに書いたりします。

Twitter Feed