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

2023-12-02

我计划重命名现有 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 开发文档中阅读的内容,我假设以下迁移策略:

Step 1

Modify 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我可能会冒丢失该列中数据的风险。

Step 2

创建一个空的迁移:

python manage.py makemigrations --empty myapp

Step 3

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

class Migration(migrations.Migration):

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

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

Step 4

应用迁移:

python manage.py migrate

Step 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()

Step 6

创建另一个空迁移:

python manage.py makemigrations --empty myapp

Step 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')
    ]

Step 8

应用第二次迁移:

python manage.py migrate

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

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

Thanks!


所以当我尝试这个时,似乎你可以压缩步骤 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 甚至更旧的迁移文件(!)。

Update: As ceasaro提到,较新版本的 Django 通常能够检测并询问模型是否被重命名。所以尝试一下manage.py makemigrations首先,然后检查迁移文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重命名模型和关系字段的 Django 迁移策略 的相关文章

随机推荐

  • 正则表达式中的 StackOverflowError

    我正在使用正则表达式从多个文档中提取一些字符串 我陷入了这个 StackOverflowError 它来自特定的正则表达式 如果不使用该正则表达式 程序可以顺利执行 My Code package com gauge ie Annotato
  • for 循环“索引超出范围”c# webdriver

    我从这个循环中得到 索引超出范围 但我需要使用循环创建的新元素 我该怎么做 请帮助解决问题 int linkCount driver FindElements By CssSelector a href Count string links
  • missModalViewControllerAnimated 已弃用

    我刚刚升级到 XCode 4 5 以更新我的 iOS 应用程序以在 iPhone 5 的 4 英寸显示屏上运行 但我收到一个构建错误 dismissModalViewControllerAnimated is deprecated在线上 s
  • 多次显示绘图窗口

    import matplotlib import pylab x 1 2 3 4 5 6 7 8 9 10 y 2 4 6 8 10 12 14 16 18 20 plotting pylab plot x y pylab show plo
  • 玩2.0创建变量并赋值

    我为这个问题搜索了很多 我只想在 scala html 模板中创建一个变量 并且需要一个临时变量 我找到的唯一 有意义 的解决方案如下 defining hello text testvariable gt h1 output of var
  • 如何在打印时隐藏打印按钮?

    我想在单击按钮时打印页面而不打开新选项卡 我有以下几行代码可以为我完成这项工作 function PrintDiv var contents document getElementById wrapper innerHTML var fra
  • 创建新活动时出错

    我正在尝试创建一个新的活动 但出现以下错误 图像底部 InvalidReferenceException 执行 FreeMarker 模板时出错 如果我通过创建扩展 Activity 类的 Java 类来手动创建 Activity 那么它就
  • 从 Pandas DataFrame 创建复杂的嵌套字典

    我试图找到一种从平面 Pandas DataFrame 实例创建 可能是深层 嵌套字典的通用方法 假设我有以下数据框 dat pd DataFrame name John John John John Henry Henry age 24
  • 通过 AVAssetReader 读取音频样本

    如何通过 AVAssetReader 读取音频样本 我找到了使用 AVAssetReader 复制或混合的示例 但这些循环始终由 AVAssetWriter 循环控制 是否可以只创建一个 AVAssetReader 并读取它 获取每个样本并
  • 如何设置邮件服务器?

    我希望任何发送电子邮件至 电子邮件受保护 并且服务器可以获取邮件 因此我可以使用一些服务器端脚本语言 例如 Ruby 来解析电子邮件的内容 Ruby 解决方案会很棒 如果您从未设置过 smtp 服务器 并且不愿意深入研究和学习很多内容 那么
  • 在表单上的标签或文本框中显示字段的描述

    我想要做的是在表单上的标签中显示当前所选字段的描述 我觉得它当前显示的位置 左下状态栏 几乎不明显 如何访问状态栏中的该值 例如 在我的表单上 当我选择 员工姓名 字段时 在左下角以小字显示 您正在注册的员工的姓名 我知道在我的表单上的某些
  • 使用 typescript 将 javascript 模块导入为动态

    我想导入一个普通的 javascript 模块 例如vhost 使用 CommonJS 进入我的 node js 打字稿文件 我可以用下面的行来做到这一点 import vhost require vhost 我们假设我在互联网上找不到 d
  • JavaScript-onclick

    第一次在这里发帖 但天知道我一直使用这个网站来搜索问题 P 好吧 我现在遇到了自己的问题 因为我似乎无法轻松地在 Google 上进行搜索 并且在玩完之后搞了两个多小时 终于决定发帖问一下大家的想法 我在这里想要完成的是 当您将鼠标悬停在
  • 如何将json对象数组保存到mongoose?

    我正在尝试将对象数组保存到猫鼬模式 但无法将数据加载到laptop模式我只看到一个插入包含id 如何将 json 对象数组保存到 mongoose 模式 控制器 js var laptopData name Hp probook 15 1
  • 以编程方式创建和呈现模态视图控制器

    我正在尝试以编程方式从使用情节提要启动的视图控制器中声明模式视图控制器 我希望看到一个空白视图 但我只看到来自第一个控制器的 Web 视图 void viewDidLoad super viewDidLoad NSString fullUR
  • 如何将 Excel 工作表导出为图像?

    我正在尝试从 Excel 工作表生成图像 经过大量研究后 我使用以下代码 但在某些时候我遇到了异常 using System using System Collections Generic using System Linq using
  • Flexslider 延迟加载 - 仅在真正需要时加载图像

    这实际上只是对 Flexslider 延迟加载的回答的后续内容here我正在使用我在下面粘贴的代码 我想更改它 以便仅在真正需要时加载图像 我尝试了其他 Flexslider 属性 之前 和之后 但它们在第一张幻灯片上造成了延迟 请问我可以
  • 如何使用 WSO2 ESB 从数据库检索多行?

    我想使用 wso2 esb 检索数据库中的多行 使用 dblookup 中介器我只能检索一行 建议使用 WSO2 DSS 你能帮我使用 DSS 完全检索 ESB 中的多行吗 Thanks 如果您不想使用 DSS 这就是我们的情况 那么您可以
  • React js组件,map可以工作,foreach不行

    我有一个呈现标签的组件 它循环遍历地图并显示数据 我尝试使用 forEach 但它不起作用 但是 如果我将映射转换为数组 它就可以工作 foreach 也不适用于数组 我在这里缺少什么 这有效 render return div class
  • 重命名模型和关系字段的 Django 迁移策略

    我计划重命名现有 Django 项目中的多个模型 其中有许多其他模型与我要重命名的模型具有外键关系 我相当确定这将需要多次迁移 但我不确定确切的过程 假设我从 Django 应用程序中的以下模型开始 名为myapp class Foo mo