diadia

興味があることをやってみる。自分のメモを残しておきます。

ForeignKeyフィールドのcreate

ベース記事

インスタンスのForeignKeyフィールドにNoneデータ入力しcreateするとき

foreignkeyにdjangoオリジナルのUserモデルを登録して、views.pyにてインスタンスを作成するコードを書いてみた。このとき困ったことを書く。

models.pyにて

class Hoge(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)

views.pyにて

def yeah(requesrt):
    if request.user.is_authenticated and request.user is not None:
        hoge_obj = Hoge.objects.create(user = request.user )
    else:
        hoge_obj = Hoge.objects.create(user = None )
    render(request, home.html)

このようなものを書く。

この状態だとエラーが出てしまう。原因がオリジナルのモデルにあるのか、Hogeモデルにあるのかわからなかったが、結論はHogeモデルに原因があった。ForeignKeyフィールドでnullの情報を入力するには、CASCADEではなくSET_NULLにしなければならない。これで hoge_obj = Hoge.objects.create(user = None )が問題なく動く。
https://docs.djangoproject.com/ja/2.1/ref/models/fields/#arguments

ForeignKeyのSET_NULLを使うときのメモ

products = models.ForeignKey(Product, on_delete=models.SET_NULL)としてmakemigrationsしてもうまく行かなかった。エラーの詳細は以下のようになっていた。

ERRORS:
product_sets.Set.products: (fields.E320) Field specifies on_delete=SET_NULL, but cannot be null.
	HINT: Set null=True argument on the field, or change the on_delete rule.

null=Trueにすれば大丈夫とのことだったので、外部キーのすべてのフィールドにnull=Trueしてみた。それでも同じエラーが出てしまった。
どうやらこれはForeignKey(on_delete=models.SET_NULL)としているところに、null=Trueを追加でセットすればエラーを解消することができる。