1

我有一个 Django 项目,它使用 South 应用程序来处理模式和数据迁移。在我的一个应用程序中,我有迁移(编号 0004),它负责从 json 文件加载数据夹具:

class Migration(DataMigration):

    def forwards(self, orm):
        from django.core.management import call_command
        call_command("loaddata", "dummy_data.json")

在同一个项目中,我尝试添加需要再添加一个文件的“软删除”功能,定义为:

deleted_at = models.DateTimeField(blank=True, null=True)

基于此更改,我添加了编号为 0009 的新迁移。之后,我启动了migrate命令,这给了我错误:

DatabaseError: Problem installing fixture 'C:/Users/Grzegorz/PycharmProjects/Dummy Project/Dummy\app_subapp\fixtures\dummy_data.json': Could not load app_subapp.DummyData(pk=1): (1054, "Unknown column 'deleted_at' in 'field list'")

这很奇怪,因为在应用迁移 0004 时发生此错误,该迁移 0004 之前工作正常,并且在此步骤中从 South 进程提交的文件deleted_at不应该也不存在于我的数据库中。我发现从步骤中使用加载夹具移动迁移0009 之后的 0004 解决了问题,但看起来很脏,不是解决此问题的好方法。

你有什么建议我该如何解决这个问题并正确处理 South 的迁移和夹具加载?

4

3 回答 3

3

我找到了一个可以完成这项工作的 Django 片段!

https://djangosnippets.org/snippets/2897/

它根据固定在夹具中的模型而不是您的应用程序代码中的实际模型定义来加载数据!非常适合我。

于 2014-03-24T12:19:12.703 回答
0

另一种解决方案是加载夹具文件并使用迁移的 orm 插入它:

from south.v2 import DataMigration
import json

class Migration(DataMigration):

    def forwards(self, orm):
        json_data=open("path/to/your/fixture.json")
        items = json.load(json_data)
        for item in items:
            # Be carefull, this lazy line won't resolve foreign keys
            obj = orm[item["model"]](**item["fields"])
            obj.save()

        json_data.close()

使用此方法,您的夹具将被加载到当前数据库结构中。

于 2014-02-07T15:38:31.137 回答
0

我找到了解决我的问题的方法。最后,我从南迁移中提取了负载固定装置,并将此操作委托给 Fabric。现在我已经分离了迁移和加载初始数据,所以一切都按我的预期工作。

于 2013-09-11T11:52:47.233 回答