这个问题很难定义,请耐心等待。
我有一个称为Blog的模型。我有三个迁移。
0001_initial :为Blog创建表
0002_seed_data :将一些数据播种到该表中。要播种此数据,我使用:
all_blogs = Blog.objects.all()
for blog in all_blogs.iterator():
#some logic here
blog.save()
0003_add_column :向该表添加新列“ title”
当我在过去已经运行过 0002_seed_data 的数据库上运行 0003_add_column 时,它可以工作。
但是,当我在空数据库上运行这些迁移时,它在 0002_seed_data 处失败,因为它无法在数据库中找到标题。它给出类似于以下内容的错误:
django.db.utils.OperationalError:(1054,““字段列表”中的未知列“ Blog.title””))
在我看来,这就像鸡到蛋的问题,因为 0002 不能运行,直到表中没有标题列。可以在 0003 的表中添加标题,但是只有在 0002 运行后才能运行。 一个简单的解决方案是更正顺序。这是我过去一直在做的事情。但这意味着每次我向该表添加新列时,都必须更正其顺序。
快速搜索错误将返回一些解决方案,其中大多数解决方案都涉及删除所有迁移并使用makemigrations重新进行。这不会解决我的问题
那么有没有更好的方法呢?
答案 0 :(得分:3)
您还没有显示迁移文件,但是我想您是从模型文件中导入Blog类的。如您所见,您无法做到这一点,因为它与迁移过程中此时的数据库状态不同步。
幸运的是,Django迁移支持“历史”模型,这些模型根据db的状态正确表示了模型。无需导入模型,而是通过调用apps.get_model()
在RunPython函数中以编程方式获取模型。所以:
def my_function(apps, schema_editor):
Blog = apps.get_model('myapp', 'Blog')
all_blogs = Blog.objects.all()
...
请参阅data migrations上的文档。
答案 1 :(得分:-1)
您应该使用SQL命令更改数据库中的任何内容。您可以使用python库,但由于使用Django类模型(现在具有title字段)的错误来了,但是当它当时试图查找该值时没有任何值,因此最好从SQL查询中获取该值,执行您要对此执行的任何操作。