我正在使用Django 1.6,我使用South来处理迁移.在我的大多数应用程序中,我曾经有过initial_data.json
文件.我将它们转换为加载迁移而不是Django自动加载(因为这在文档中是推荐的)
当我遇到一个奇怪的行为/错误,根据模型代码而不是迁移状态完成加载装置时,我使用的是南方版本0.8.2.我看到最新版本(0.8.4)已经添加了一些相关的bug修复loaddata
,所以我升级到它.
现在我在加载夹具的所有迁移中收到以下错误:
UserWarning: No fixture named 'X' found.
当我使用Django时loaddata
它工作正常.关于如何解决这个问题的任何想法?
South只是修补syncdb以跳过具有迁移的模型的夹具加载,并且在运行应用程序的最终迁移之后实际加载它们.
加载initial_data并不需要你实际做某事,而是按照Django的文档中的说明将灯具放在正确的位置.
引用文档:
默认情况下,Django会在每个应用程序内的fixtures目录中查找fixture.您可以将FIXTURE_DIRS设置设置为Django应该看的其他目录列表.
这意味着如果你有一个名为"myapp"的应用程序,你就会在里面创建一个"fixtures"目录并将json放在那里,例如:myproject/myapp/fixtures
.
Django 1.7 引入了内置迁移.它们的界面类似于南方; 用于创建迁移makemigrations
,运行它们migrate
以及其他的管理命令.
但是,initial_data
在syncdb运行时不再自动加载灯具; 除非它是现有的应用程序,并且没有迁移.发行说明中提到了这一点.
文档现在建议创建一个datamigration
处理夹具加载.幸运的是,这很容易做到,这就是我通常这样做的方式:
$ python manage.py makemigrations --empty myapp
如果您只进行了初始迁移,则最终会得到这些文件(请注意,为了清楚起见,我重命名了迁移0002):
myapp/ ??? __init__.py ??? fixtures ? ??? my_initial_data.json ??? migrations ??? 0001_initial.py ??? 0002_load_fixture.py ??? __init__.py
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), ]