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を追加でセットすればエラーを解消することができる。