说我有这个型号:
class Knight(models.Model):
name = models.CharField(max_length=100)
of_the_round_table = models.BooleanField()
并说我想将其更改为:
class Knight(models.Model):
name = models.CharField(max_length=100)
round_table = models.BooleanField()
在schemamigration southtut --auto --update
之后,南方提示我不可避免的事情:
? The field 'Knight.of_the_round_table' does not have a default specified, yet is NOT NULL.
? Since you are adding this field, you MUST specify a default
? value to use for existing rows. Would you like to:
? 1. Quit now, and add a default to the field in models.py
? 2. Specify a one-off value to use for existing columns now
? Please select a choice: 2
? Please enter Python code for your one-off default value.
? The datetime module is available, so you can do e.g. datetime.date.today()
>>> "True"
最后,当我尝试使用./manage.py migrate someapp
迁移时,我收到了这个:
ValueError: invalid literal for int() with base 10: 'True'
不确定为什么" True"是不正确的。我相信我试过没有括号进入它,它也给了它。我在这做错了什么?我该如何输入默认值?
编辑:
附加问题 - 为什么南方要求我为之前的每次迁移输入一个值?如果我再次迁移并更改了' round_table
'要{' table
',它会要求我为' of_the_round_table = models.BooleanField()
',' round_table = models.BooleanField()
'设置默认设置。 ,以及' table = models.BooleanField()
'。为什么?它不应该只是要求最新的那个,并且无论如何都要使这个过程更快?如果你过去做了很多迁移,我会发现这很痛苦。
答案 0 :(得分:1)
"True"
不是一个字符串的布尔值。使用True
。
南方不仅可以向前迁移,也可以向后迁移。如果向后迁移,则需要知道要在“新”列of_the_round_table
中放置哪些值。在非空字段上指定默认值可能更容易,或者更好地将迁移定义为rename_column
,而不是删除一列并添加另一列(如自动为您所做)。