【问题标题】:Update new field for all users upon migration迁移时为所有用户更新新字段
【发布时间】:2019-05-06 06:39:07
【问题描述】:

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

【问题讨论】:

    标签: django django-models django-migrations


    【解决方案1】:

    当然,只需根据您的要求使用migrations.RunSQLmigrations.RunPython

    在这种情况下,后者可能更容易使用,但您也应该能够使用单个 UPDATE SQL 语句来做到这一点。

    【讨论】:

    • 迁移文件是在正确应用迁移后创建的!我在通过迁移创建的新文件中添加了一个脚本来更改字段is_core_administrator(对于最旧的用户)。这个脚本将如何再次运行?我是否需要再次申请迁移?问这个是因为这不会改变这个is_core_administrator 字段。我很好奇,那个脚本什么时候运行?为了更清晰,我使用了 RunPython。
    • 您可以使用python manage.py makemigrations myapp --name seed_core_administrator --empty 创建一个空的迁移文件,然后在其中添加RunPython 操作。然后只需运行python manage.py migrate
    【解决方案2】:

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

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

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

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

    RunPython(set_default_values)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 2019-04-28
        • 2016-07-27
        • 2015-08-03
        • 1970-01-01
        • 2017-03-27
        相关资源
        最近更新 更多