找不到名为"X"的夹具

Ami*_*hum 14 django django-south

我正在使用Django 1.6,我使用South来处理迁移.在我的大多数应用程序中,我曾经有过initial_data.json文件.我将它们转换为加载迁移而不是Django自动加载(因为这在文档中是推荐的)

当我遇到一个奇怪的行为/错误,根据模型代码而不是迁移状态完成加载装置时,我使用的是南方版本0.8.2.我看到最新版本(0.8.4)已经添加了一些相关的bug修复loaddata,所以我升级到它.

现在我在加载夹具的所有迁移中收到以下错误:

UserWarning: No fixture named 'X' found. 
Run Code Online (Sandbox Code Playgroud)

当我使用Django时loaddata它工作正常.关于如何解决这个问题的任何想法?

tut*_*uju 6

南和固定装置

South只是修补syncdb以跳过具有迁移的模型的夹具加载,并且在运行应用程序的最终迁移之后实际加载它们.

确保您的initial_data文件位于正确的位置

加载initial_data并不需要你实际做某事,而是按照Django的文档中的说明将灯具放在正确的位置.

引用文档:

默认情况下,Django会在每个应用程序内的fixtures目录中查找fixture.您可以将FIXTURE_DIRS设置设置为Django应该看的其他目录列表.

这意味着如果你有一个名为"myapp"的应用程序,你就会在里面创建一个"fixtures"目录并将json放在那里,例如:myproject/myapp/fixtures.

Django 1.7和更新

Django 1.7 引入了内置迁移.它们的界面类似于南方; 用于创建迁移makemigrations,运行它们migrate以及其他的管理命令.

但是,initial_data在syncdb运行时不再自动加载灯具; 除非它是现有的应用程序,并且没有迁移.发行说明中提到了这一点.

文档现在建议创建一个datamigration处理夹具加载.幸运的是,这很容易做到,这就是我通常这样做的方式:

1.创建一个空数据迁移

$ python manage.py makemigrations --empty myapp
Run Code Online (Sandbox Code Playgroud)

如果您只进行了初始迁移,则最终会得到这些文件(请注意,为了清楚起见,我重命名了迁移0002):

myapp/
??? __init__.py
??? fixtures
?   ??? my_initial_data.json
??? migrations
    ??? 0001_initial.py
    ??? 0002_load_fixture.py
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

2.更新0002_load_fixture.py运行loaddata 的代码

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations
from django.core.management import call_command


def load_my_initial_data(apps, schema_editor):
    call_command("loaddata", "my_initial_data.json")


class Migration(migrations.Migration):
    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(load_my_initial_data),
    ]
Run Code Online (Sandbox Code Playgroud)