如何在Django 1.7+中创建每个项目的initial_data fixture

Joz*_*zef 8 django django-fixtures django-1.7 django-migrations

在Django 1.7之前,我曾经fixtures在设置中定义了每个项目目录:

FIXTURE_DIRS = ('myproject/fixtures',)
Run Code Online (Sandbox Code Playgroud)

并使用它来放置我的initial_data.json夹具存储整个项目必不可少的默认.这对我来说效果很好,因为我可以通过将每个项目数据与特定于应用程序的数据分开来保持设计的清洁.

现在使用Django 1.7,initial_data不推荐使用夹具,建议数据迁移与应用程序的架构迁移结合在一起; 没有明显的选择全球每个项目的初始数据.

此外,新的迁移框架执行兼容应用程序(包括django.contrib.auth应用程序)的迁移之前安装所有旧的初始数据夹具.此行为导致我的包含默认组的fixture 无法安装,因为该auth_group表尚未存在于DB中.

有关如何(优雅地)所有迁移之后(或至少在auth应用程序迁移之后)运行灯具的建议?还是其他任何想法来解决这个问题?我发现夹具是提供初始数据的好方法,并希望有一种简单而干净的方式来声明它们的自动安装.新的RunPython太麻烦了,我认为它对大多数用途来说都是一种过度杀伤力; 它似乎只适用于每个应用程序的迁移.

Ant*_*wan 4

如果您绝对想使用固定装置,只需在数据迁移中使用RunPython和即可。call_command

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

def add_data(apps, schema_editor):
    call_command('loaddata', 'thefixture.json')

def remove_data(apps, schema_editor):
    call_command('flush')


class Migration(migrations.Migration):

    dependencies = [
        ('roundtable', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(
            add_data,
            reverse_code=remove_data),
    ]
Run Code Online (Sandbox Code Playgroud)

但是,建议使用 python 代码和 Django ORM 加载数据,因为您不必面临完整性问题。

来源