【问题标题】:Django migrations: crashing in a data migration refering to an already removed model fieldDjango 迁移:在引用已删除模型字段的数据迁移中崩溃
【发布时间】:2020-02-03 14:28:47
【问题描述】:

创建测试数据库,Django 引发此异常

django.core.exceptions.FieldError: Cannot resolve keyword 'xxx' into field. Choices are: ...

失败的迁移是自定义迁移,将数据从(比如说)ModelA 移动到 ModelB

def forwards(apps, schema_editor):
    ...
    prev_list = ModelA.objects.all().values_list('xxx').distinct()
    for item in prev_list:
        ModelB(xxx=item).save()

我的下一个动作已检查ModelA,可以预期,它没有名为XXX 的字段

class ModelA(Model):
   # no field named xxx

稍微挖掘一下这里发生了什么:

  1. ModelA 曾经有一个名为 xxx 的字段
  2. 有一个迁移尝试创建从ModelA.xxx 读取的ModelB
  3. ModelA 没有这样的字段,因为稍后迁移会删除该字段,所以我的模型中没有声明该字段。

为什么创建测试数据库失败(来自python manage.py test)?
我怎样才能解决这个问题?

【问题讨论】:

  • 如何在迁移文件中获得ModalAModelB 类?您应该从 apps 参数中获取它们,而不是从源文件中导入它们
  • 当 Django 开始创建测试数据库时,它会自省模型并检测到在迁移尝试使用该字段时现在没有 xxx 字段 - 我可能猜到这是导致错误的原因。跨度>
  • @ivissani 就是这样!我想我可以编辑错误的迁移文件并使用apps.get_model() - 它照常导入模型而不是使用历史版本

标签: python django django-migrations


【解决方案1】:

你不应该直接导入ModelA,而是导入历史版本如下(参见编写迁移的文档here)。

ModelA = apps.get_model('myapp', 'ModelA')

根据docs,如果遇到此问题,您可以编辑旧迁移:

...历史模型问题可能不会立即显而易见。如果遇到这种故障,可以编辑迁移以使用历史模型,而不是直接导入并提交这些更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 2015-07-10
    • 1970-01-01
    • 2021-06-09
    • 2018-02-22
    • 2021-06-02
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多