这是这个问题的扩展: 如何在两个Django应用程序之间移动模型(Django 1.7)

我想使用Django迁移将模型M从应用程序A移动到应用程序B而不会丢失数据。 最好的投回答这个问题(而不是接受一个,一个是ozan )建议migrations.SeparateDatabaseAndState的使用情况,并在两个步骤做:

  1. 迁移以删除模型并重命名(而不是删除)db表。
  2. 迁移以创建新模型并使用现有表。

这看起来对我来说是一种非常聪明的方式,但是在我的情况下,还有另一个模型N有一个M的外键。现在,当我在第二步调用makemigrations来创建迁移文件时,我得到一个错误,因为在那个阶段模型AM不再存在:

ValueError: Lookup failed for model referenced by field C.N.m: A.M  

有办法处理这个吗?

#1楼 票数:3 已采纳

这就是我最终做到的。 主要思想是在删除旧模型之前创建新模型,如schillingt建议的那样,但也使用migrations.SeparateDatabaseAndState来避免数据库修改,如链接问题中所示。

  1. 将模型从A复制到B.定义db_table以分配相同的表名

  2. 进行B迁移。将迁移文件修改为仅使用migrations.SeparateDatabaseAndState创建状态而不是数据库表。

  3. 修改N中的外键以指向BM而不是AM(通过to ='B.M')。

  4. 为此更改进行迁移。

  5. 从A中删除模型

  6. 进行迁移以进行删​​除。 对其进行修改,使其仅删除模型,而不删除数据库表。

  7. 应用所有迁移。

之后仍然可以重命名表,但是在我使用的1.7版本中,迁移不支持db_table更改。

#2楼 票数:0

这是我如何处理它。

  1. 在应用B中创建新模型(包括应用A中模型的1:1Key),以及从模型N到应用B模型的迁移和新外键。
  2. 创建迁移以将应用A中旧模型的所有数据复制到应用B中的新模型。
  3. 在模型N上填充新的FK。您将通过使用应用程序A和B中的模型之间的1:1Key来执行此操作。
  4. 更新所有代码和外键以引用应用B中的新模型并运行迁移。
  5. 将FK从N移除到应用程序A的模型,并从应用程序A中删除模型。运行迁移以从数据库中删除它们。

  ask by Kit Fisto translate from so

未解决问题?本站智能推荐:

2回复

将Django模型移动到另一个应用程序,该应用程序是另一个模型的父模型

我必须在两个不同的应用程序(如app1和app2)中使用django模型,在app1中,我得到了Model1,在app2中,我得到了BaseModel,而Model1就是这样 Model1和BaseModel在一个应用程序中,但是我将Model1移至app2,现在我也想将BaseModel也
1回复

Django:扩展其他应用程序的模型

我正在 Django 上从事类似 ERP 的小型项目,其中包含不同的应用程序(产品、销售、采购、会计、MRP 等)。 其中一些具有依赖项(例如,Sales 应用程序需要 Products 应用程序)。 为了模块化和松耦合,我试图让应用程序尽可能独立。 但是,如果应用程序可以在其依赖项的模型中扩展(添
1回复

Django1.7-模型发现和应用程序配置自定义应用程序标签

我目前正在使用Django==1.7.1 。 我有一些具有相同模块名称的可重用应用程序。 这也使得模型的应用标签相同。 这实际上是矛盾的。 您不能在settings文件的INSTALLED_APPS中使用不同库中具有相同名称的模块。 我通过为模块添加AppConfig解决了这个问题,
2回复

Django模型外键字段在测试期间的迁移中不可用

我有这个模型。class TransportOrder(SomeMixin, models.Model): order = models.ForeignKey( to="orders.Order", on_delete=models.PROTECT,
3回复

向其中一个模型添加新字段后,无法迁移到django应用程序

所以,这是我之前的类别模型: 我运行了 makemigrations 和 migrate 命令,应用程序运行良好然后我不得不在模型中再添加一个字段: 现在,当我运行 makemigrations 时,它会出现以下错误: 返回 Database.Cursor.execute(self, query,
1回复

迁移回滚期间无法从其他应用程序导入Django模型

我正在为new_app创建数据迁移,并有可能将其回滚。 此迁移会将一些数据添加到其他应用程序中定义的模型: my_other_app 。 要将模型导入要更新或删除记录的位置,请使用apps.get_model()方法。 当我应用迁移时,它就像魅力。 但是,当我运行时尝试使用:~>
3回复

应用程序中的Django重复迁移

Django 不断为我的应用程序进行重复迁移。 在更改模型之前,我已经运行了makemigrations和migrate 。 更改后,我再次运行makemigrations为更新的模型进行迁移,出现以下错误: 要修复它们,请运行“python manage.py makemigrations --
1回复

django可重用应用程序:删除迁移中的依赖项?

我正在为django-cms写一个可重复使用的django应用程序。 它将提供一些cms-plugins和一个插件框架。 我已经为我的插件创建了迁移。 我是在一段时间前开始的,并且第一个插件及其迁移是使用django-cms==3.4.something创建的,它们在迁移文件中引用了这样