django在向后迁移/ loaddata之后从fixture中加载数据是使用模型模式而不是数据库模式

lec*_*hup 11 django django-south

我在导入旧数据时遇到问题,而不是我当前的模型架构.我使用的流程导致错误:

  • dumpdata with python manage.py dumpdata - > 0002
  • 对模型做一些修改
  • 使用python manage.py schemamigration app_name --auto - > 0003生成迁移
  • 运行迁移
  • 玩数据库
  • 迁移到0002
  • loaddata生成SQL,其中我有当前(迁移0003)字段,并导致loaddata进程失败(mpoly是添加字段)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py",
Run Code Online (Sandbox Code Playgroud)

第44行,在执行中返回self.cursor.execute(query,args)DatabaseError:关系"localization_province"的列"mpoly"不存在第1行:... e"("id","name","slug" ,"mpoly")V ...

  • 评论在0003之前完成的models.py中的更改,使所有工作正常

如果我想加载数据,有没有办法避免在向后迁移后使用模型?

也许我错过了一些非常明显的东西......

PS:我使用South 7.3,Django 1.2.3和PostgreSQL 8.4作为数据库后端.

CJ *_*net 10

亚历克斯·维达尔(Alex Vidal)提出了一个很好的快速解决方案 它需要Gary Bernhardt的Dingus图书馆.一旦我们有时间,我们就会将Dingus依赖关系分解出来并向South提交拉取请求,但如果你现在处于绑定状态,这可能会让你失去它:

from dingus import patch


def loaddata(orm, fixture_name):
    _get_model = lambda model_identifier: orm[model_identifier]

    with patch('django.core.serializers.python._get_model', _get_model):
        from django.core.management import call_command
        call_command("loaddata", fixture_name)
Run Code Online (Sandbox Code Playgroud)

用法:

from apps.common.utils import loaddata


class Migration(DataMigration):
    def forwards(self, orm):
        loaddata(orm, "initial_fjords.json")
Run Code Online (Sandbox Code Playgroud)

到目前为止,我们只在Django 1.3中进行了测试.编辑:我检查了Django的_get_model历史,这应该适用于Django 0.95及以上.