Djangoのモデル(model)とDDL
Djangoのモデル(model)作成では、各項目に属性や制約を設定し、
python manage.py makemigrations
コマンドを発行すればDDLのSQLを発行することができますよね。
このSQLは、
python manage.py migrate
で実行することができるのですが、モデルとDBの定義を常に一致させることができ、なおかつバージョン管理もできるため、上手く使えば大変便利な機能です。
Djangoを選定する上でのメリットの1つですね。
NOT NULL制約を外したい
Djangoのモデルを元に作成されるSQLのDDLについて、デフォルトではNOT NULL制約が設定されることになります。
ただ、状況やプロジェクトによっては、NOT NULL制約を外したい時がありますよね。
この方法についてなかなか見つからなかったのですが、解決方法を見つけたので共有します。
例えば、test_tableというテーブルがあり、その中のカラムの1つにtestという文字列の項目があったとします。
通常のモデルの定義で言えば、以下のようになりますね。
class test_table(models.Model): test = models.CharField(max_length=512)
さて、このまま実行するとどうなるでしょう。
はい、最初にお話したように、発行されるDDLのSQLでは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」を入れれば解決できるので、同じような箇所で詰まった人がいたら試してみてください。
- 作者: 関根裕紀,新井正貴
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2019/05/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2018/06/09
- メディア: 単行本
- この商品を含むブログを見る