django 迁移时如何设置/提供默认值?

2024-01-19

Scenario:
我有一个模型,Customer

class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    company = models.CharField(max_length=100)


现在我更新了company属性带有一个ForeignKey关系如下,

class Company(models.Model):
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=100)


class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    company = models.ForeignKey(Company)



我需要的是,当新的迁移应用于数据库时,对应Company实例必须自动生成并映射到company的属性Customer实例。

那可能吗?我怎样才能做到这一点?


让我们从您的原始模型开始,一步一步地进行。

class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    company = models.CharField(max_length=100)

首先,您必须保留原始字段并创建一个新字段,以便之后能够恢复旧数据。

class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    company = models.CharField(max_length=100)
    _company = models.ForeignKey(Company)

现在您可以使用以下命令创建第一个迁移manage.py makemigrations。然后你必须创建一个数据迁移 https://docs.djangoproject.com/en/stable/howto/writing-migrations/。使用创建迁移manage.py makemigrations yourapp --empty并更新生成的文件:

from django.db import migrations

def export_customer_company(apps, schema_editor):
    Customer = apps.get_model('yourapp', 'Customer')
    Company = apps.get_model('yourapp', 'Company')
    for customer in Customer.objects.all():
        customer._company = Company.objects.get_or_create(name=customer.company)[0]
        customer.save()

def revert_export_customer_company(apps, schema_editor):
    Customer = apps.get_model('yourapp', 'Customer')
    Company = apps.get_model('yourapp', 'Company')
    for customer in Customer.objects.filter(_company__isnull=False):
        customer.company = customer._company.name
        customer.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourapp', 'xxxx_previous_migration'),  # Note this is auto-generated by django
    ]

    operations = [
        migrations.RunPython(export_customer_company, revert_export_customer_company),
    ]

上述迁移将填充您的Company模型和Customer._company字段根据Customer.company.

现在你可以放弃旧的Customer.company并重命名Customer._company.

class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    company = models.ForeignKey(Company)

Final manage.py makemigrations and manage.py migrate.

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

django 迁移时如何设置/提供默认值? 的相关文章

随机推荐

  • 向特定用户授予文件访问权限[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在Linux中 如何向特定人员授予文件 文件夹的访问权限 换句话说 假设我只想允许只有用户 fred 能够读取文件 那么我该怎么做呢 请注意 我了解
  • 密码验证C++

    嗨 这是我第一次使用课程 所以对我糟糕的解释表示歉意 基本上我正在为电梯程序制作密码功能 LogIn 是我的类的名称 其中包含字符串 john 它是密码 除了错误密码尝试的循环之外 一切似乎都工作正常 如果第一次密码尝试正确 则代码可以正常
  • 成员函数特征

    我正在编写一个模板类 它包装成员函数以减少一些调用 如果某些条件为真 则不需要调用成员函数 签名看起来像这样 template
  • heroku 上的数据库名称以及用户、密码和主机

    我想在heroku 上安装一个带有数据库的php 脚本 如何获取我安装的数据库的数据库名称 密码 用户和主机信息 Heroku 上有多种不同的数据库 您可以查看选项并将它们添加到您的应用程序中 addons heroku com https
  • 如何调试 grails 命令

    当我运行 dbm generate changelog 时 抛出异常 我想调试这个脚本 但我不知道该怎么做 我尝试在脚本文件中放置断点 DatabaseMigrationCommon groovy然后在 eclipse 中创建新的 debu
  • AngularJS - 多次 ng-click - 事件冒泡

    在以下示例中 li h3 item title h3 li
  • Android 上的生物识别提示副标题文本被截断

    我已经实现了生物识别身份验证 其中我的副标题 验证用户名的生物识别信息以登录到我的App Name 有点长 最后会被截断 这主要发生在三星设备上 任何字符长度限制或 OEM 问题都无法解决 他们必须为此提出一个解决方案 因为我们无法控制它
  • 开发 Internet Explorer、浏览器辅助对象扩展?

    1 我正在尝试用 C 创建一个简单的 BHO 就像这里已经回答的那样 https stackoverflow com a 5740004 285594 https stackoverflow com a 5740004 285594 2 但
  • 沿最后一个维度索引 numpy nd 数组

    有没有一种简单的方法使用索引数组沿最后一个维度对 numpy 多维数组进行索引 例如 取一个数组a形状的 10 10 20 假设我有一个索引数组b 形状 10 10 这样结果就是c i j a i j b i j 我尝试过以下示例 a np
  • 仅向上缩放 Three.js 几何体

    我正在尝试缩放几何图形 y 轴 这使得我的立方体既放大又缩小 我认为 mesh transformY 可以将立方体动画放大到缩放值的一半 这会让立方体看起来像是向上缩放的 还有其他解决方案吗 var geometry new THREE B
  • 创建只能查看一个数据库并只能从中进行选择的用户?

    我们在 SQL Server 上有多个数据库 我们想要创建 1 个新用户 该用户可以查看数据库 c 但看不到其余数据库 该用户应该只能从此数据库中进行选择 而不能进行其他选择 我已经用谷歌搜索了一段时间 我发现的最接近的是拒绝查看任何数据库
  • 如何使用 phantomJS 模拟鼠标悬停在 HTML 元素上

    我有下面的 phantomJS 代码来获取 HTML 代码 var page require webpage create var url http example com page open url function status var
  • Debian 8 上的 Python numba / llvmlite - 我无法构建 llvmlite

    我尝试在 Debian 8 系统上安装 numba 如下所述 http llvmlite pydata org en latest install index html http llvmlite pydata org en latest
  • 如何在 .net x64 中保存/加载 16 位图像?

    以前 当我使用win32时 我使用自由图像 http freeimage sourceforge net 为了加载和保存位深度大于 8 位的位图 这就是我处理的每张图像 因为我正在做医学成像 在任何人说什么之前 是的 我和我的客户已经花了很
  • Java Web 应用程序中的异步任务

    异步作业 例如从网站下载乐谱 或在完成某些关键任务后发送电子邮件 现在 当我们下载一些乐谱时 我们必须在当前页面等待才能获取响应页面或下载文件 是否有可能我可以点击下载乐谱 它会在后台发生 以便我可以导航到其他部分 网站 同时检查工作状态
  • 我只想有字符(根本没有符号、数字和空格)

    应该用 SQLite 完成 像这样 是的 我知道 这是很容易的任务 如果我使用UDF 用户定义函数 但是 我对此有很大的困难 所以 寻找另一种方式 no UDF方式 来实现我的目标 Thanks 供你参考 我留下了一个我未能制作UDF的链接
  • django-tables2:在渲染方法中使用请求用户

    我正在使用 djnago tables2 显示事件模型中的数据 我需要将当前请求用户放入表的渲染方法中 以进一步调用模型函数来获取当前用户的响应 我怎样才能做到这一点 My Model class Event models Model na
  • 如何在 Linux 上调试本机 Java 崩溃?

    我见过这个问题 https stackoverflow com questions 1860832 how should i diagnose and prevent jvm crashes and 本文 http weblogs java
  • Mongo Scala Play - java.lang.NoSuchMethodError: com.mongodb.ConnectionString.getApplicationName()Ljava/lang/String;]

    我正在尝试在 scala play mongo 原型上进行基本的 CRUD 操作 该代码作为独立的主方法工作 但当作为通过控制器调用的播放应用程序执行时 会出现运行时异常 debug Running task Cancel Null che
  • django 迁移时如何设置/提供默认值?

    Scenario 我有一个模型 Customer class Customer models Model name models CharField max length 100 age models IntegerField compan