Django 在1.10中通过迁移设定数据种子

Django 在1.10中通过迁移设定数据种子,django,django-migrations,django-1.10,Django,Django Migrations,Django 1.10,这个问题有点难以定义,所以请耐心听我说 我有一个模型叫博客。我有三次迁移 0001_首字母:为博客创建表格 0002_seed_data:将一些数据植入此表。要为这些数据设定种子,我使用: all_blogs = Blog.objects.all() for blog in all_blogs.iterator(): #some logic here blog.save() 0003\u添加列:将新列“标题”添加到此表中 当我在一个数据库上运行0003_add_列时,0002_see

这个问题有点难以定义,所以请耐心听我说

我有一个模型叫博客。我有三次迁移

0001_首字母:为博客创建表格

0002_seed_data:将一些数据植入此表。要为这些数据设定种子,我使用:

all_blogs = Blog.objects.all()
 for blog in all_blogs.iterator():
  #some logic here
  blog.save()
0003\u添加列:将新列“标题”添加到此表中

当我在一个数据库上运行0003_add_列时,0002_seed_数据在过去已经运行过了,它可以工作

但当我在空数据库上运行这些迁移时,它在0002_seed_数据处失败,因为它在数据库中找不到标题。它给出的错误类似于:

django.db.utils.OperationalError:(1054,“字段列表”中的未知列“Blog.title”)

对我来说,这看起来像是个鸡毛蒜皮的问题,因为在表中没有标题列之前,0002无法运行。在0003中有在表中添加标题的规定,但只有在运行0002后才能运行。 一个简单的解决办法是纠正顺序。这就是我过去一直在做的事情。但这意味着每次我向这个表中添加一个新列时,它的顺序都必须得到纠正

快速搜索错误会返回一些解决方案,其中大多数都谈到删除所有迁移并使用makemigrations再次进行迁移。这不能解决我的问题


有更好的方法吗?

您应该使用SQL命令来更改数据库中的任何内容。您可以使用python库,错误就要来了,因为您使用的是Django类模型,它有now title字段,但当它试图查找当时没有值的值时,最好从SQL查询中获取值,执行您想要对其执行的任何操作

您尚未显示迁移文件,但我猜您正在从模型文件导入Blog类。正如您所看到的,您不能这样做,因为它在迁移过程中与数据库的状态不同步

幸运的是,Django迁移支持“历史”模型,这些模型根据数据库的状态正确地表示模型。您可以通过调用
apps.get\u model()
在RunPython函数中以编程方式获取模型,而不是导入模型。因此:

def my_function(apps, schema_editor):
    Blog = apps.get_model('myapp', 'Blog')
    all_blogs = Blog.objects.all()
    ...

请参阅上的文档。

能否显示迁移文件的内容?