[Django] postメソッドで受け取った内容をforeignkeyを持つDBに保存する方法

記事内に広告が含まれています。

ValueError at /
Cannot assign "'1'": "childDB.parent" must be a "ParentDB" instance.Cannot assign "'XXX'": "DB名.カラム名" must be a "DB名" instance.
djangoで、クライアント(ブラウザ側)から受け取ったフォームをデータベースに登録する際、表記のエラーが表示されました。このエラーを回避するには、ForeignKeyのカラムかどうかに注意する必要があります。

解決法

以下のようなデータベースを想定します。

#models.py
class ParentDB(models.Model):
    id = models.AutoField(primary_key=True)
    pname = models.CharField(max_length=100)

class childDB(models.Model):
    id = models.AutoField(primary_key=True) #予約id, 主キー, 自動生成
    parent = models.ForeignKey(ParentDB, on_delete=models.CASCADE) #外部キー
    childname = models.CharField(max_length=100)

childDBのparentカラムが外部キーで設定され、parentDBを参照しています。

データベース間の関係性: childDBのparentカラムがParentDBのidを参照しています。

以下のコードのように、Foreign keyを設定しているカラムには、参照先の親キーオブジェクトを設定します。

#views.py
parent = request.POST.get('parent')        #POSTメソッドで送られてきた入力値
childname = request.POST.get('childname')
#データベースへの登録
childDB.objects.create(
    parent=ParentDB.objects.get(pid=parent),
    childname = childname
)

まとめ

データベースの登録などを扱う際は、親キー・外部キーについてよく理解しておく必要があると感じました。

Many-to-one relationships | Django documentation
The web framework for perfectionists with deadlines.

コメント