3
2

More than 3 years have passed since last update.

Djangoで既存のモデルに後からDateFieldを用いた項目を追加するときの注意点

Posted at

はじめに

開発中、後から既存のモデルに項目を追加する時に少し操作が必要であることを知ったのでその知見についてまとめました。

既存モデル

まずは簡単のために以下のような単純なモデルがあることを想定します。

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を設定することで回避することもできます。

何か不手際がございましたらご指摘よろしくお願いします。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2