親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。育児のイロハという育児サイト(https://ikujip.jp)の開発も行っているため、その開発で使用されている技術についても掲載しています。

Djangoのモデル作成でNOT NULLを外したい

Djangoのモデル(model)とDDL

Djangoのモデル(model)作成では、各項目に属性や制約を設定し、

python manage.py  makemigrations

コマンドを発行すればDDLSQLを発行することができますよね。
このSQLは、

python manage.py  migrate

で実行することができるのですが、モデルとDBの定義を常に一致させることができ、なおかつバージョン管理もできるため、上手く使えば大変便利な機能です。
Djangoを選定する上でのメリットの1つですね。

NOT NULL制約を外したい

Djangoのモデルを元に作成されるSQLDDLについて、デフォルトではNOT NULL制約が設定されることになります。
ただ、状況やプロジェクトによっては、NOT NULL制約を外したい時がありますよね。

この方法についてなかなか見つからなかったのですが、解決方法を見つけたので共有します。

例えば、test_tableというテーブルがあり、その中のカラムの1つにtestという文字列の項目があったとします。
通常のモデルの定義で言えば、以下のようになりますね。

class test_table(models.Model):
        test = models.CharField(max_length=512)

さて、このまま実行するとどうなるでしょう。

はい、最初にお話したように、発行されるDDLSQLではNOT NULL制約が付いてくるのです。
そのSQLを修正すればまぁ問題はないのですが、やはりモデルの定義の中で、入力が必須なのかそうではないのか見分けをつけ、DDLと定義を合わせたいですよね。

そしてせっかく便利なモデルと連動したマイグレーション機能なのに、発行されたSQLに手を加えたくないですよね。

NOT NULL制約の外し方

対応方法はとても簡単でした。
以下のように、カラム定義の中に「null=True」を入れればいいだけでした。

class test_table(models.Model):
        test = models.CharField(max_length=512, null=True)

これでmakemigrationsを実行してSQLを見てみると、NOT NULL制約が外れていることがわかると思います。

どこかのサイトを見ていると、「required=True」とか「required=False」をつければ解決できると書いていましたが、私の場合は実践してみると以下のようなエラーが出ました。

TypeError: __init__() got an unexpected keyword argument 'required'

特に検証していないのですがバージョンの違いかもしれませんね。
とりあえずは「null=True」を入れれば解決できるので、同じような箇所で詰まった人がいたら試してみてください。

基礎から学ぶ Django

基礎から学ぶ Django

  • 作者: 関根裕紀,新井正貴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2018/07/27
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
Python Django 超入門

Python Django 超入門