Agile育成ブログ
未来を変える喜びを
Django

DjangoでYou are Trying to add a non-nullable fieldと表示されたときの対策


Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490

既にレコードが存在する状態で、NULL禁止かつデフォルト値指定なしのフィールドを追加するとこうなる。
デフォルト指定していないので、既存のレコードにはNULL禁止であるにも関わらず、NULLが入ってしまう。そこで既存のレコードはどうするか聞いている。与えられた選択肢は2つ。

警告文に応じる(1度限りのdefaultを指定する)

from django.db import models

class Topic(models.Model):

    comment = models.CharField(verbose_name="コメント",max_length=2000)

    def __str__(self):
        return self.comment

モデルフィールドを追加

from django.db import models

class Topic(models.Model):

    comment = models.CharField(verbose_name="コメント",max_length=2000)
    dt      = models.DateTimeField(verbose_name="投稿日時")

    def __str__(self):
        return self.comment
You are trying to add a non-nullable field 'dt' to topic 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:
timezone.now()

フィールドオプションのdefaultを追加する

models.pyの新しく追加したdtにフィールドオプションのdefaultを指定する。DatetimeFieldの場合、下記のようにdefaultを指定する。

from django.db import models
from django.utils import timezone

class Topic(models.Model):

    comment = models.CharField(verbose_name="コメント",max_length=2000)
    dt      = models.DateTimeField(verbose_name="投稿日時",default=timezone.now)

    def __str__(self):
        return self.comment

実行するときに値が変わる、メソッドのtimezone.now()ではなく、その関数そのものを意味する属性値のtimezone.nowを指定する。timezonedjango.utilsの中に含まれているので、冒頭でインポートさせる。

You cannot copy content of this page