【问题标题】:Couldn't load fixtures with South in Django project无法在 Django 项目中使用 South 加载固定装置
【发布时间】:2013-09-12 23:30:50
【问题描述】:

我有一个 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 的迁移和夹具加载?

【问题讨论】:

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


    【解决方案1】:

    我找到了一个可以完成这项工作的 Django sn-p!

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

    它会根据固定装置中冻结的模型而不是应用程序代码中的实际模型定义来加载数据! 非常适合我。

    【讨论】:

    • sn-p (get_mode -> get_model) 中有一个错字,否则就可以了! (django 1.6)。
    • 非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 如果您从不使用关系字段的默认值,没关系,否则您必须处理数据迁移。
    【解决方案3】:

    另一种解决方案是加载夹具文件并使用迁移的 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会被加载到当前的数据库结构中。

    【讨论】:

    • 这不好:没有关系处理并且绑定到 JSON 格式。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多