使用Django South从具体继承转向抽象继承

2023-11-23

我有一个现有的 Django 项目,其中有几个使用基类的具体继承的模型。经过仔细考虑,并阅读了人们喜欢雅各布·卡普兰-莫斯的内容后不得不说一下,在我的例子中没有必要使用这个具体的继承。我想改为使用抽象基类。

使事情变得复杂的是我的网站是实时的并且我有用户输入的数据。因此,我需要在整个过渡过程中保持所有数据完好无损。

我举一个例子更具体:

Before:

app1/models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

app2/models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

base_app/models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

After:

app1/models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

app2/models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

base_app/models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

    class Meta:
        abstract = True

现在,我的计划是首先添加abstract = True到基本模型。然后,对于每个使用的模型BaseModel, 一次一个:

  • 使用 South 迁移数据库并使用 --auto 标志创建此迁移
  • 使用向南数据迁移。例如,我将循环访问 Model1 中的每个对象,以获取 BaseModel 中具有相同 pk 的对象,并将 BaseModel 对象的每个字段的值复制到 Model1 对象。

首先,这会起作用吗?其次,有没有更好的方法来做到这一点?

Update:

我的最终解决方案详细描述如下:

http://www.markliu.me/2011/aug/23/migration-a-django-postgres-db-from-concrete-inhe/


  1. 添加 NewBaseModel,我们使用不同的名称,这样它就不会与当前的非抽象名称冲突(否则 South 实际上会删除 BaseModel)。

    class NewBaseModel(models.Model):
        user = models.ForeignKey(User)
        another_field = models.CharField(max_length=1000)
    
        class Meta:
            abstract = True
    
  2. 设置Model1和Model2继承自NewBaseModel

  3. 运行 schemamigration --auto,2 个新字段将添加到 Model1 和 Model2
  4. 运行 datamigration --empty 并根据 BaseModel 中的值填充新字段
  5. 加载生产数据库并仔细检查所有内容是否正确迁移
  6. 删除 BaseModel 并将 New BaseModel 重命名为 BaseModel
  7. 运行 schemamigration --auto (这should工作 ;) )
  8. Deploy!

注意:使用orm迁移以使用模型架构的当前状态时的变量。

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

使用Django South从具体继承转向抽象继承 的相关文章

随机推荐

  • 在 wix 中更改我的组件 GUID?

    我什么时候应该更改或不更改 WIX 中的组件 GUID Microsoft SDK信息令人困惑 格利茨科夫编辑 澄清一下 问题涉及何时应更改 MSI 组件的组件 GUID 组件可以在以下方面进行更改 更改目标路径 在同一组件中添加或删除文件
  • p:密码不会重新显示预填充的模型值

    我有这样的托管 bean ManagedBean SessionScoped public class utilisateur implements Serializable private String login yous privat
  • 将两行之间的文本替换为存储在 sed 变量中的文件内容

    假设我有一个名为original txt包含以下内容 red blue water food tree gray white 我还有一个名为new txt包含以下内容 green black yellow purple 现在我想编写一个脚本
  • 找不到开发人员磁盘映像堆栈溢出 xcode 7.2,iOS 9.3.1 [重复]

    这个问题在这里已经有答案了 将我的设备更新到 iOS 9 3 1 Xcode 后 给出 无法找到开发人员磁盘映像 我使用的是 xcode 7 2 请帮忙 您需要下载 Xcode v 7 3 使用 gt 9 3 iOS 版本 并升级到 Xco
  • Pyspark:选择特定列及其位置

    我想知道如何在数据框中选择具有编号但不具有名称的特定列 在 Pandas 中是这样的 df df iloc 2 这是可能的 您始终可以使用以下方式获取列的名称df columns n 进而select it df spark createD
  • scala - 从字符串中获取类

    在 Scala 中 我使用一个需要类参数的 Java 库 例子 def service OAuthService new ServiceBuilder provider classOf RunApi RunApi 是 Java 类 不过 我
  • 如何开通区域监控服务?

    我稍微简化了问题 当我在应用程序中创建和添加区域并询问这些区域的状态时 我在中看到以下内容monitoringDidFailForRegion方法 The operation couldn t be completed kCLErrorDo
  • 在 CVS 预提交挂钩中使用提交消息

    是否可以在 CVS 的预提交挂钩中使用提交消息 CVS 服务器正在远程运行 我使用以下命令访问它pserver 理想情况下 如果文件通过过滤器 我希望允许提交or提交消息包含特定文本 我没有选择使用其他版本控制系统 以下是一些有用的教程 供
  • OutOfMemory 时生成 java 转储

    我有一个程序最终应该生成OutOfMemory 程序代码为 public class VeryLargeObject implements Serializable public static final int SIZE 1 lt lt
  • Live555:基于“testOnDemandRTSPServer”的X264流直播源

    我正在尝试创建一个 rtsp 服务器来传输我的程序的 OpenGL 输出 我看了一下如何编写 Live555 FramedSource 以允许我直播 H 264 但我需要该流是单播的 所以我看了一下 testOnDemandRTSPServ
  • 如何使用 Facebook React 的 JSX 来拥有条件元素并保持 DRY?

    我如何有选择地在 JSX 中包含一个元素 下面是一个使用横幅的示例 如果已传入该横幅 则该横幅应位于组件中 我想要避免的是必须在 if 语句中重复 HTML 标记 render function var banner if this sta
  • 在 WooCommerce 结帐时禁用 AJAX

    我想问一下如何在结账页面 您输入送货和账单信息的地方 禁用 AJAX 而不是使用 AJAX 根据您的位置更新购物车摘要 而是通过自然刷新来更新 目前 每当用户通过送货位置切换其位置时 购物车摘要都会自行更新 而无需重新加载页面 我想删除该
  • 仅当密码时,ASP:TextBox 值才会在回发中消失

    我有一个像这样的 asp net 文本框
  • kprobes 支持 ftrace 后,Linux 内核中的跟踪点是否多余?

    当 Linux 内核中提供对 ftrace 的 kprobe 事件支持时 使用跟踪点事件的用例是什么 似乎使用 跟踪点事件 可以完成的所有事情都可以使用 kprobe 事件来完成 因为可以在跟踪点事件可用的同一点设置 kprobe 事件 我
  • POSIXct 值在 reshape2 dcast 中变为数字

    我正在尝试使用最新的 dcastreshape2包 1 2 1 对数据框 或 data table 进行非规范化 其中 value var 是 POSIXct 类型 但在生成的数据框中 日期值已丢失其 POSIXct 类并变为数字 如果我希
  • 在构造函数中初始化数组,而不使用默认构造函数或赋值

    考虑 struct A A int A const A struct B A foo 2 B const A x const A y foo x y HERE IS THE PROBLEM 我期待它能够工作 因为我在 GCC4 3 中使用
  • 如何查找我的 Android 应用程序的 MD5 指纹

    我正在尝试注册 Android Google 地图 它要求 MD5 指纹 如何从我的应用程序中获取指纹 我是密钥库的新手 无法理解我在网上找到的东西 如此简单的说明表示赞赏 提前致谢 您将需要两个密钥库 一个用于调试目的 一个用于发布目的
  • 是否可以在没有滚动条的情况下计算视口宽度(vw)? [复制]

    这个问题在这里已经有答案了 如标题所述 是否可以计算vw仅在CSS中没有滚动条 例如 我的屏幕宽度为1920px vw回报1920px 伟大的 但我的实际身体宽度只是这样1903px 有没有办法让我找回1903px仅带有 css 的值 不仅
  • __WEBPACK_IMPORTED_MODULE_4_react___default.a.memo 不是函数

    我只是使用 redux 和 react redux connect 函数连接应用程序 以及状态和调度 编译没有问题 但结果没有显示 如下所示 我试图找到它 发现我必须更改react版本 sudo npm install save email
  • 使用Django South从具体继承转向抽象继承

    我有一个现有的 Django 项目 其中有几个使用基类的具体继承的模型 经过仔细考虑 并阅读了人们喜欢雅各布 卡普兰 莫斯的内容后不得不说一下 在我的例子中没有必要使用这个具体的继承 我想改为使用抽象基类 使事情变得复杂的是我的网站是实时的