将 BooleanField 添加到 django 模型,现有项目的此字段应为 True,对于新项目应为 False

Vin*_*tta 2 python django django-models django-forms

我正在尝试向 Django 模型添加一个设置复选框,因此,我将 BooleanField 添加到现有的 django 模型之一,对于数据库中的所有现有行,此布尔字段应为 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
Run Code Online (Sandbox Code Playgroud)

对此的任何帮助表示赞赏。与覆盖save()方法有关吗?

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

Ala*_*air 5

添加带有 的字段default=True,然后运行makemigrations以创建迁移。然后将默认值切换为Falsemakemigrations再次运行。

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

使用这种方法,我认为您最终会在运行迁移和重新启动您的网络服务器之间有一个小窗口,其中通过网站创建新行会导致“非空约束失败”。如果这是不可接受的,那么您可以使用 来创建字段null=True,运行迁移,然后删除null=True并运行最终数据迁移以将任何空值更改为TrueFalse根据需要。


ivi*_*ani 4

嗯,关于如何处理这种情况有很多选择。一种方法是首先简单地添加没有默认值的字段,然后要求 Django 创建适当的迁移。所以你的模型应该是这样的:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

当你运行命令时,manage.py makemigrationsDjango 会询问你要做什么,你可以选择提供一个“一次性默认值”。该值将用于填充现有实例。通过执行此操作,Django 生成的迁移代码会将您提供的一次性默认值设置为所有先前存在的实例。

之后,您应该再次更改模型,以便为您的字段设置所需的默认值,以便您的模型如下所示:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

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