当前位置: 首页 > 面试题库 >

用于重命名模型和关系字段的Django迁移策略

朱宜
2023-03-14
问题内容

我计划重命名现有Django项目中的多个模型,在该模型中,还有许多其他模型与我要重命名的模型具有外键关系。我相当确定这将需要多次迁移,但是我不确定确切的过程。

假设我从Django应用程序中的以下模型开始myapp

class Foo(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_ridonkulous = models.BooleanField()

我想重命名该Foo模型,因为该名称实际上没有任何意义,并且会导致代码混乱,并且Bar会使名称更清晰。

根据我在Django开发文档中阅读的内容,我假设采用以下迁移策略:

第1步

修改models.py:

class Bar(models.Model):  # <-- changed model name
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, but not field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, but not field name
    is_ridonkulous = models.BooleanField()

请注意,的AnotherModel字段名称foo没有更改,但是关系已更新为Bar模型。我的理由是,我不应该一次更改太多,并且如果将该字段名称更改为,则bar可能会丢失该列中的数据

第2步

创建一个空迁移:

python manage.py makemigrations --empty myapp

第三步

编辑Migration在步骤2中创建的迁移文件中的类,RenameModel以将该操作添加到操作列表中:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RenameModel('Foo', 'Bar')
    ]

步骤4

应用迁移:

python manage.py migrate

第5步

在中编辑相关字段名称models.py

class Bar(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_ridonkulous = models.BooleanField()

第6步

创建另一个空迁移:

python manage.py makemigrations --empty myapp

步骤7

编辑Migration在步骤6中创建的迁移文件中的类,以将RenameField任何相关字段名称的操作添加到操作列表中:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0002_rename_fields'),  # <-- is this okay?
    ]

    operations = [
        migrations.RenameField('AnotherModel', 'foo', 'bar'),
        migrations.RenameField('YetAnotherModel', 'foo', 'bar')
    ]

步骤8
应用第二次迁移:

python manage.py migrate

除了更新其余代码(视图,表单等)以反映新的变量名之外,这基本上是新的迁移功能如何起作用的吗?

另外,这似乎需要很多步骤。迁移操作可以某种方式压缩吗?

谢谢!


问题答案:

因此,当我尝试此操作时,你似乎可以压缩步骤3-7:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'), 
    ]

    operations = [
        migrations.RenameModel('Foo', 'Bar'),
        migrations.RenameField('AnotherModel', 'foo', 'bar'),
        migrations.RenameField('YetAnotherModel', 'foo', 'bar')
    ]

如果不更新导入名称,例如admin.py甚至更旧的迁移文件(!),则可能会遇到一些错误。

更新:正如ceasaro所提到的,较新版本的Django通常能够检测并询问是否重命名了模型。因此,请先尝试manage.py makemigrations,然后检查迁移文件。



 类似资料:
  • 问题内容: 我想更改模型中特定字段的名称: 应更改为: 使用South进行此操作最简单的方法是什么? 问题答案: 你可以使用该功能。 的第一个参数是表名,因此记住如何创建表名很重要: Django自动从你的模型类和包含它的应用程序的名称中派生数据库表的名称。通过将模型的“应用程序标签”(即你在manage.py startapp中使用的名称)与模型的类名称连接在一起,并在其之间加下划线,来构造模型

  • 问题内容: 我在Django模型中添加了一个新的,不可为空的字段,并尝试使用迁移来部署该更改。如何将用于现有模型的默认值设置为这些模型的某些功能而不是常量? 例如,假设我以前有一个字段,而我刚刚添加了一个字段,该字段的值最初要设置为模型的。在迁移中我将如何做? 这就是我要开始的事情: 问题答案: 我刚刚学习了如何通过一次迁移来做到这一点! 当运行时,应要求你设置一个默认值。在这里定义所有可以使它满

  • mariadb 10.2中似乎有一个突破性的变化。7如果尝试重命名字段可为Null的datetime列,并且如果运行迁移,将出现错误: 创建迁移: 创建第二次迁移以重命名列: 有没有一个解决办法来让这个工作? 根据条令/dbal问题: 为了允许表达式作为默认值,并将其与文字区分开来,Mariadb现在在信息模式中引用默认值。列表。这一变化在(Oracle-)Mysql/MariaDB平台之间带来了

  • 我的自定义用户模型: 有没有办法指定多个?类似于这样用户就可以通过email和username登录了?

  • 问题内容: 如何使用Django的ORM和PostgreSQL后端存储二进制数据的“ blob”?是的,我知道Django对这种事情不屑一顾,是的,我知道他们更喜欢你使用ImageField或FileField来表示,但这足以说明我的应用程序不切实际。 我曾尝试通过使用TextField对其进行破解,但是当我的二进制数据未严格确认模型的编码类型(默认为unicode)时,会出现偶尔的错误。例如 问