5

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

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

所有应用程序均已正确安装在 settings.py 中。

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

任何想法为什么某些应用程序被忽略?

4

4 回答 4

6

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

要加载其他夹具,您必须使用 manage.py loaddata夹具名称。如果您在所有应用程序中使用通用命名方案,那将非常有效。如果不这样做,则必须为 loaddata 提供每个名称,或使用 find 获取灯具列表并在每个灯具中执行 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 )
于 2011-05-31T10:56:56.977 回答
4

尝试这样调用

python manage.py loaddata initial_data

或者以编程方式你可以这样称呼它

from django.core.management import call_command
call_command('loaddata', 'initial_data', verbosity=3, database='default')
于 2014-05-21T14:04:34.793 回答
4

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

Django中这种行为的罪魁祸首get_apps()在于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>手动运行将找到您应用的夹具文件。

于 2014-06-27T20:26:02.823 回答
3

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

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

appdir/fixtures/initial_data.json

于 2011-03-02T13:24:26.830 回答