无法在Django项目中加载南方的灯具

时间:2013-09-09 13:03:27

标签: django django-models django-south django-fixtures

我的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时出现了这个错误,早期工作正常,并且在此步骤中南方进程点deleted_at不应该也不存在于我的数据库中。我找到了在0009解决了问题后,从步骤0004开始使用装载夹具移动迁移,但看起来非常脏并且不是解决此问题的好方法。

您有什么建议我如何解决此问题并正确处理南方的迁移和夹具加载?

3 个答案:

答案 0 :(得分:3)

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

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

它根据夹具中冻结的模型加载数据,而不是应用程序代码中的实际模型定义! 适合我。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

另一个解决方案是加载fixture文件并使用迁移的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()

使用此方法,您将在当前数据库结构中加载fixture。