8

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

FIXTURE_DIRS = ('myproject/fixtures',)

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

现在在 Django 1.7 中,initial_datafixtures 已被弃用,建议数据迁移与应用程序的模式迁移一起包括在内;没有为全球每个项目的初始数据留下明显的选择。

此外,新的迁移框架会在为兼容的应用程序(包括应用程序)执行迁移之前安装所有旧的初始数据固定装置django.contrib.auth。此行为会导致包含默认组的我的夹具安装失败,因为该auth_group表尚不存在于数据库中。

关于如何(优雅地)在所有迁移之后或至少在身份验证应用程序迁移之后运行固定装置的任何建议?或任何其他想法来解决这个问题?我发现固定装置是提供初始数据的好方法,并且希望有一种简单而干净的方式来声明它们以进行自动安装。新的RunPython实在是太笨重了,我认为它在大多数情况下都是矫枉过正的;它似乎仅适用于每个应用程序的迁移。

4

2 回答 2

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),
    ]

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

来源

于 2014-11-14T12:09:55.850 回答
1

我建议使用工厂而不是固定装置,它们很乱且难以维护,最好将 FactoryBoy 与 Django 一起使用。

于 2014-10-23T16:12:16.137 回答