迁移时为所有用户更新新字段
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)
请说明您的用例。我看到你有三个选择:
- 您可能需要迁移命令来在每次迁移程序时执行此修改。如果是这样,您需要在 makemigrations 生成的脚本末尾添加一个小循环,如果您使用修改后的迁移脚本将程序发送到生产环境,您将能够这样做。
- 如果您只需要对您的开发环境进行一次性修改,我建议最好不要修改迁移脚本,而是使用 Django shell 手动更改 is_core_administrator。
- 如果您需要编程以设置其第一个创建的 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)
最近学习了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)
请说明您的用例。我看到你有三个选择:
- 您可能需要迁移命令来在每次迁移程序时执行此修改。如果是这样,您需要在 makemigrations 生成的脚本末尾添加一个小循环,如果您使用修改后的迁移脚本将程序发送到生产环境,您将能够这样做。
- 如果您只需要对您的开发环境进行一次性修改,我建议最好不要修改迁移脚本,而是使用 Django shell 手动更改 is_core_administrator。
- 如果您需要编程以设置其第一个创建的 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)