如何从所有应用程序加载Django灯具?

时间:2011-03-02 12:13:36

标签: django unit-testing fixtures django-fixtures

我在我的Django应用程序中使用了灯具,但只有两个应用程序正在加载它们的灯具。

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

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

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

为什么有些应用被忽略了?

4 个答案:

答案 0 :(得分:5)

每次执行syncdb时都会导入Initial_data。尽管我记得很公平,但它也会覆盖您手动完成的任何更改。

要加载其他灯具,您必须使用manage.py loaddata fixturename。 如果您在所有应用程序中使用通用命名方案,那么这种方法很有效。 如果不这样做,则必须为loaddata指定每个名称,或使用find来获取 每个中的fixture和exec loaddata列表:

编辑:(因为我在virtualenv中将manage.py添加到/ bin中,当我安装django包时,我只使用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 )

答案 1 :(得分:4)

尝试以这种方式调用

python manage.py loaddata initial_data

或者以编程方式将其称为

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

答案 2 :(得分:3)

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

Django中此行为的罪魁祸首是get_apps()中的loaddata.py

  1. django.core.management.commands.loaddata,第102行
  2. django.db.models.loading,第132行
  3. 要欺骗Django查看应用的<app>/fixtures/文件夹,您必须向应用添加(空)models.py文件。 (很好,并对该文件发表评论以使事情变得清晰!)

    <强>&LT;应用&GT; /models.py

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

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

答案 3 :(得分:2)

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

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

APPDIR /装置/ initial_data.json