迁移时为所有用户更新新字段

Update new field for all users upon migration

最近学习了Django。现在,在我正在处理的一个项目中,我需要向模型 UserProfile 添加一个新字段 is_core_administrator,这会将最老的用户设置为核心管理员。我需要为所有迁移的用户更新此字段。 有没有办法做到这一点?我的意思是,当我进行迁移时,是否可以将此字段更新为最老用户的真值,以及其他用户的假值。找到最老的用户并不困难,因为我们已经有了另一个字段 DateJoined。我只想在进行迁移时更新相应的字段。

当然可以,根据您的要求使用migrations.RunSQL or migrations.RunPython即可。

在这种情况下,后者可能更容易使用,但您也应该能够使用单个 UPDATE SQL 语句来完成此操作。

您可以在 Django 迁移中使用 RunPython 选项来做到这一点。

在迁移文件的顶部创建一个函数。

def set_default_values(apps, schema_editor):
    # Set the defualt values

在迁移文件中的更改字段操作之前添加以下行。

RunPython(set_default_values)

请说明您的用例。我看到你有三个选择:

  1. 您可能需要迁移命令来在每次迁移程序时执行此修改。如果是这样,您需要在 makemigrations 生成的脚本末尾添加一个小循环,如果您使用修改后的迁移脚本将程序发送到生产环境,您将能够这样做。
  2. 如果您只需要对您的开发环境进行一次性修改,我建议最好不要修改迁移脚本,而是使用 Django shell 手动更改 is_core_administrator。
  3. 如果您需要编程以设置其第一个创建的 UserProfile is_core_administrator set True 何时何地安装,我建议最简单的方法是定义 save(self): 并在对象内检查您要保存的是第一时间,可能是使用 UserProfile.objects.count() 或 UserProfile.objects.exists() 并相应地设置 is_core_administrator。也许像下面这样:
class UserProfile(models.Model):
    ...
    ...
    is_core_administrator=models.BooleanField(default=False)
    def save(self, force_insert=False, force_update=False, using=None, 
        update_fields=None):
        if not UserProfile.objects.exists():
            self.is_core_administrator=True
        self.etiket=self.woo_name
        return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)