#はじめに
開発中、後から既存のモデルに項目を追加する時に少し操作が必要であることを知ったのでその知見についてまとめました。
#既存モデル
まずは簡単のために以下のような単純なモデルがあることを想定します。
class NameModel(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
ここにDateField()
を用いた項目を追加することを考えます。
#項目追加
以下のように項目を追加します。
class NameModel(models.Model):
name = models.CharField(max_length=50)
date = models.DateField() #追加
def __str__(self):
return self.name
モデルを変更したのでマイグレーションします。
$ python manage.py makemigrations
ここで以下のようなメッセージが表示されます。
You are trying to add a non-nullable field 'date' to NameModel without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
このメッセージはnullであるdate
を追加しようとしているがそれはできず、解決するためには二つの選択肢のいずれかを選べという意味です。
これは元々あったデータを入力するには当然dateという項目は存在せず、よって中身がnullになってしまっていることによってこれが生じています。
2)はモデルを作り直すという選択肢なのでここでは1)を選択することにします。
すると
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>>
と表示されます。
これはdateに対して何を入れますか?という意味なので、ここは指示にしたがってtimezone.nowを追加します。
以上で完了です。
またこれはDateField
の引数にnull=True
を設定することで回避することもできます。
何か不手際がございましたらご指摘よろしくお願いします。