如何使自定义 django 迁移可逆?

2024-04-26

我最初的问题是,给定一个包含 60M 行的数据库表,我需要将字段类型从布尔字段转换为整数字段。我想为此创建一个自定义的 django 迁移(如果您有比这更好的方法,请告诉我),如下所示-

def make_changes(apps, schema_editor):
    vcs_model = apps.get_model('iot_app', 'AbstractVCSCompartmentData')
    vcs_model.objects.select_related('vcsdata').all().update(charging_status_v2=F('charging_status'))
    vcs_model.objects.select_related('vcsdata').all().update(charging_status_backup=F('charging_status'))  # backup




class Migration(migrations.Migration):
    dependencies = [
        ('iot_app', '0030_auto_20220225_1027.py'),
    ]

    operations = [

        migrations.AddField(  # backup field
            model_name='AbstractVCSCompartmentData',
            name='charging_status_backup',
            field=models.PositiveIntegerField(blank=True, null=True),
        ),


        migrations.AddField(
            model_name='AbstractVCSCompartmentData',
            name='charging_status_v2',
            field=models.PositiveIntegerField(blank=True, null=True),
        ),

        migrations.RunPython(make_changes),

        migrations.RemoveField(
            model_name='AbstractVCSCompartmentData',
            name='charging_status',
        ),
        migrations.RenameField(
            model_name='AbstractVCSCompartmentData',
            old_name='charging_status_v2',
            new_name='charging_status',
        ),
    ]


我想展开所有更改,即使我的自定义迁移可逆。 我已经经历过运行Python https://docs.djangoproject.com/en/4.0/ref/migration-operations/#runpython文档。但我很困惑如何在我的中添加新字段reverse_code()功能。

创建备份字段的想法是将数据库恢复到之前的状态。

鉴于该表中有 60M 行,这是正确的方法吗?不会暂时锁表吧?我想尽可能高效地做到这一点


我在你发表评论后编辑了我的答案 - 此时此刻RunPython在回归步骤中执行,charging_status已更名为charging_status_v2和旧的charging_status场存在。所以你可以直接从备份复制到charging_status

def make_changes(apps, schema_editor):
    vcs_model = apps.get_model('iot_app', 'AbstractVCSCompartmentData')
    vcs_model.objects.select_related('vcsdata').all().update(charging_status_v2=F('charging_status'))
    vcs_model.objects.select_related('vcsdata').all().update(charging_status_backup=F('charging_status'))  # backup


def backwards(apps, schema_editor):
    vcs_model = apps.get_model('iot_app', 'AbstractVCSCompartmentData')
    vcs_model.objects.select_related('vcsdata').all().update(charging_status=F('charging_status_backup'))



class Migration(migrations.Migration):
    dependencies = [
        ('iot_app', '0030_auto_20220225_1027.py'),
    ]

    operations = [

        migrations.AddField(  # backup field
            model_name='AbstractVCSCompartmentData',
            name='charging_status_backup',
            field=models.PositiveIntegerField(blank=True, null=True),
        ),


        migrations.AddField(
            model_name='AbstractVCSCompartmentData',
            name='charging_status_v2',
            field=models.PositiveIntegerField(blank=True, null=True),
        ),

        migrations.RunPython(make_changes, backwards),

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

如何使自定义 django 迁移可逆? 的相关文章

  • 如何在heroku上设置django-compressor,离线压缩到S3

    我遵循了在 SO 和不同博客中找到的每一条 QA 建议 在我的开发机器上一切正常 但在 Heroku 上没有任何效果 这是我的设置 DEFAULT FILE STORAGE arena utils MediaRootS3BotoStorag
  • 如何在 Django 查询中动态提供查找字段名称? [复制]

    这个问题在这里已经有答案了 我想在 Django 模型的几个字段中查找某个字符串 理想情况下 它会类似于 keyword keyword fields foo bar baz results for field in fields look
  • 如何切换到新数据库

    我想将我的 django 项目部署到生产环境 并将其与一个新的空数据库关联 我做了如下操作 创建一个新的空数据库 更新了settings py并将数据库名称指向新的数据库名称 删除了我的应用程序下的migrations文件夹 运行 pyth
  • admin.py 用于项目,而不是应用程序

    如何指定项目级别admin py 我前段时间问过这个问题 但由于该问题缺乏活动 我刚刚获得了风滚草奖 gt Project 设置 py admin py 这就是我想要开始工作的 App admin py 我知道该怎么做 例如 admin a
  • Django 项目层次结构/组织

    我是 Django 新手 正在开始一个项目 我想以正确的方式来做 我想知道您认为组织项目的最佳实践是什么 我有一些问题 如何将静态资源与Python代码分离 这样我就不会浪费时间通过Django处理静态内容 由于应用程序是可重用的模块 因此
  • django celery - 如何将 request.FILES['photo'] 发送到任务

    我正在尝试通过以下方式将 request FILES photo 从我的网站上传的文件 发送到 tCelery tasks upload photos delay img request FILES photo 我收到 pickle 错误
  • Django:对对象中的列表进行排序

    I have list1按 id 顺序排列 像这样 4 2 1 17 edited 如何获得list2从对象条目按顺序list1 在查询ValueList的情况下 还有关于这个问题 u 4 u 2 u 1 u 17 因为有些属性不在Quer
  • 在 Linux/Ubuntu 计算机上通过 Python/Django 设置网络设置

    我正在为嵌入式计算机开发一个简单的网络界面 计算机将附带一个静态默认 IP 然后需要由可能不懂技术 Linux 的安装技术人员进行更新 基本上我需要从 Django 应用程序更改以下系统设置 IP地址 Subnet 默认网关 DNS 服务器
  • Django 管理员使用 JWT

    Using 姜戈 1 11 Python 3 6 FE 中的 DRF 与 JWT 我知道 Django 管理员使用会话和基本身份验证 到目前为止我所做的 用 AWS Cognito 替换了 Django 管理员身份验证登录页面 用户转到do
  • Django Book 平台可用吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 The 姜戈书 http www djangobook com en 1 0 有一个简洁的内容发布模板
  • 在 django 模板中显示字典键

    我想知道如何在 django 模板中显示字典键本身 字典示例 resources coin coin grain grain iron iron stone stone wood wood 模板 b Coin b upgrade coin
  • 如何向 tabularinline 块的每一行添加行号

    我有一个 ModelAdmin 类 其内联类型为 TabularInline 我希望 TabularInline 的每一行在其左侧显示一个行号 随着新记录添加到内联中 该数字会增加 并且会在编辑表单时显示 我更喜欢行号不是内联数据模型的一部
  • 使用 django-filter 检查并清除过滤器

    我在用Django 过滤器 http django filter readthedocs io过滤一个ListView如果应用了任何过滤器 希望显示 清除所有过滤器 链接 由于过滤系统的通用性 我还没有找到实现此目的的直接方法 到目前为止我
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • 在 Django 中创建用户个人资料页面

    我是 Django 的初学者 我需要设置一个网站 其中每个用户都有一个个人资料页面 我见过 django 管理 用户的个人资料页面 应该存储一些只能由用户编辑的信息 谁能指出我这怎么可能 任何教程链接都会非常有帮助 另外 django 是否
  • 如何更新多个字段,包括django模型实例的相关字段?

    我想知道 更新多个字段 包括 django 中模型实例的相关字段 的标准方法是什么 Class User models Model id models CharField name models CharField dob models C
  • 在 Django 管理界面中更改模型类名称[重复]

    这个问题在这里已经有答案了 可能的重复 django 中管理模型类的详细名称 https stackoverflow com questions 5959462 verbose name for admin model class in d
  • 服务器端 Google 标记聚类 - Python/Django

    在尝试使用客户端方法来聚类大量 Google 标记后 我认为这对于我的项目 拥有 28 000 多名用户的社交网络 来说是不可能的 是否有在服务器端对坐标进行聚类的示例 最好是在 Python Django 中 我希望它的工作方式是根据标记
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • django获取FileField的绝对路径

    我试图在模板上调用 FileField 时检索绝对路径 以 http 开头 我怎样才能做到这一点 ie fl uploadedfile gt 返回相对路径 如 media uploads 当我想要的时候This http www blabl

随机推荐