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

时间:2019-05-06 06:39:08

标签: django django-models django-migrations

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

3 个答案:

答案 0 :(得分:0)

当然,根据需要使用migrations.RunSQLmigrations.RunPython

在这种情况下,后者可能更易于使用,但是您也应该能够使用单个margin-top: calc((var(--parent-height) - var(--child-height)) * 0.5); SQL语句来完成此操作。

答案 1 :(得分:0)

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

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

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

在迁移文件的alter field操作之前添加以下行。

RunPython(set_default_values)

答案 2 :(得分:0)

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

  1. 您可能需要每次迁移程序时都使用migration命令来执行此修改。如果是这样,您需要在makemigrations生成的脚本末尾添加一个小循环,并且如果使用修改后的迁移脚本将程序运送到生产环境中,您将可以这样做。
  2. 如果您需要将其作为开发环境的一次性修改,我建议最好不要修改迁移脚本,而要通过手动使用Django shell更改is_core_administrator。
  3. 如果需要编程以在is_core_administrator设置为True的情况下将其首次创建的UserProfile设置为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)