自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】Modelクラス、Formクラス、もしくはSerializerクラスのsaveメソッドで保存した後、保存したモデルオブジェクトのIDを手に入れる方法【データ保存した後、関連するデータも追加したい場合】

thumbnail

例えば、グループとそれに所属するメンバーのデータを一気に新規作成するタイプのフォームを作った場合。

グループとメンバーは1対多の関係になっており、それぞれの新規作成を1回のリクエストで済ませる場合は、まずグループを新規作成、その後そのグループに紐付いたメンバーを新規作成する必要がある。

ここで問題になるのが、メンバーのフィールドの一部にグループのIDを記録しなければならないこと。こういう時、保存したグループのモデルオブジェクトのIDを取得する必要がある。

保存したモデルオブジェクトのIDを取得する

保存したモデルオブジェクトのIDを取得するには、saveメソッドの返り値を受け取れば良いだけ。この返り値は保存したモデルオブジェクトのデータ。つまり、そこからid属性を参照すれば、保存したモデルオブジェクトのIDを手に入れることができる。

後は、このIDを使ってメンバーの保存をすれば良いだけ。下記は、forms.pyを使用したバリデーション保存の記事からコードを流用した。

#=====省略======

def post(self, request, *args, **kwargs):

    form    = TopicForm(request.POST)

    if form.is_valid():
        print("バリデーションOK")

        #save()の返り値を受取。
        topic   = form.save()

        #モデルオブジェクトは単体なので、そのまま.idで保存したモデルオブジェクトのIDを参照できる。
        print(topic.id)

    else:
        print("バリデーションNG")

    return redirect("bbs:index")

結論

ちなみに、ModelクラスでもSerializerクラスを使っても、saveを実行した後は保存したモデルオブジェクトが返り値として返ってくるので、そのまま.id属性を参照すればよい。

後は、1対多のモデル構造に倣い、再びバリデーションののち保存を行う。idのあと付けは下記記事のviews.pyの部分を参照すれば、例が載っている。

【Django】ユーザーモデルと1対多のリレーションを組む方法【カスタムユーザーモデル不使用】

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ