在Django模型中添加BooleanField,现有项目的此字段应为True,新项目的此字段应为False

时间:2019-03-11 17:51:38

标签: python django django-models django-forms

我正尝试向Django模型添加一个设置复选框,因此,我向现有django模型之一添加了BooleanField,对于数据库中所有现有的行,此boolean字段均应为True,但是对于创建的新行,字段应为False。

class FlagSetting(models.Model):
   name = models.CharField(max_length=10)
   flag = models.BooleanField(default=False)# by setting default to 'False' disabled the flag for the existing entries as well

我们对此提供了任何帮助。与覆盖save()方法有什么关系?

编辑我正在寻找一种尊重自动化生产部署的解决方案。谢谢大家的帮助

2 个答案:

答案 0 :(得分:2)

使用default=True添加该字段,然后运行makemigrations创建迁移。然后将默认设置切换为False,然后再次运行makemigrations

然后运行migrate来运行两个迁移。在第一次迁移运行时,Django将添加该列并将所有现有条目设置为True。第二次迁移不会更改现有行的值。

使用这种方法,我认为您将在运行迁移和重新启动Web服务器之间遇到一个小窗口,在该窗口中,通过网站创建新行将导致“非null约束失败”。如果不可接受,则可以使用null=True创建字段,运行迁移,然后删除null=True并运行最终数据迁移,以将任何空值更改为True或{{1} }。

答案 1 :(得分:0)

那么,如何处理这种情况有很多选择。一种方法是首先简单地添加没有默认值的字段,然后要求Django创建适当的迁移。因此您的模型应如下所示:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField()

当您运行命令manage.py makemigrations时,Django将询问您该怎么做,您可以选择提供“一次性默认值”。该值将用于填充现有实例。这样,由Django生成的迁移代码会将您提供的一次性默认值设置为所有先前存在的实例。

此后,您应该再次更改模型以便为字段设置所需的默认值,以便模型看起来像这样:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField(default=False)

然后必须再次运行manage.py makemigrations。这次将创建一个新的迁移,以将默认值设置为False。然后,每个新创建的实例将默认具有flag=False