【问题标题】:How to load Django fixtures from all apps?如何从所有应用程序加载 Django 固定装置?
【发布时间】:2011-07-07 05:45:15
【问题描述】:

我在我的 Django 应用程序中使用了固定装置,但只有两个应用程序正在加载它们的固定装置。

当我使用 --verbosity=2 手动运行 loaddata 时,我可以看到它只在两个应用程序中显示,尽管我在内部创建了更多的固定装置目录。

所有应用都正确安装在settings.py中。

从文档看来,Django 应该在每个已安装应用程序的 fixtures/ 目录中进行搜索。

知道为什么某些应用会被忽略吗?

【问题讨论】:

  • 我确认存在这个问题。用 Django 1.5.8 测试,python manage.py loaddata sample_content.json -v 2 表明 loaddata 命令没有查看我安装的一些应用程序。

标签: django unit-testing fixtures django-fixtures


【解决方案1】:

您必须将夹具数据放在 initial_data.[json|xml,...] 文件中。

我认为默认情况下只加载那些文件。

appdir/fixtures/initial_data.json

【讨论】:

    【解决方案2】:

    每次执行 syncdb 时都会导入 Initial_data。据我所知,它还会覆盖您手动完成的任何更改。

    要加载其他的fixture,你必须使用manage.py loaddatafixturename。 如果您在所有应用程序中使用通用命名方案,那将很有效。 如果没有,就得给loaddata每一个的名字,或者使用find来获取 每一个中的fixtures和exec loaddata列表:

    编辑:(当我安装 django 包时,我将 manage.py 添加到 virtualenv 中的 /bin,我只使用 manage.py,如果你不使用,当然需要 python manage.py loaddata)

    find . -name "*.json" -exec manage.py loaddata {} \;
    

    我在 fabfile 中使用它来自动进行分段安装:

    def load_all_fixtures():
        """Loads all the fixtures in every dir"""
        with cd(env.directory):
            run("""
                source /usr/local/bin/virtualenvwrapper.sh &&
                workon %s &&
                find -L . -name "*.json" -exec manage.py loaddata {} \;
    
                """ % env.virtualenv )
    

    【讨论】:

      【解决方案3】:

      尝试这样调用

      python manage.py loaddata initial_data
      

      或者您可以通过编程方式调用它

      from django.core.management import call_command
      call_command('loaddata', 'initial_data', verbosity=3, database='default')
      

      【讨论】:

        【解决方案4】:

        问题在于 Django 只在提供 模型 的应用程序中寻找固定装置。您可能有一个没有模型的应用程序,但您仍想加载一些固定装置(可能是另一个已安装应用程序的示例数据)。

        在 Django 中这种行为的罪魁祸首是 get_apps() in loaddata.py

        1. django.core.management.commands.loaddata,第 102 行
        2. django.db.models.loading,第 132 行

        要诱使 Django 查看您应用的 <app>/fixtures/ 文件夹,您必须向应用添加一个(空的)models.py 文件。 (请善待并在该文件中添加评论以使事情变得清晰!)

        /models.py

        """
        No real model, just an empty file to make Django load the fixtures.
        """
        

        之后,手动运行python manage.py loaddata <fixture> 会找到您应用的fixture 文件。

        【讨论】:

        猜你喜欢
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多