Как создать фикстуры initial_data для каждого проекта в Django 1.7+

До Django 1.7 я определял каталог fixtures для каждого проекта в настройках:

FIXTURE_DIRS = ('myproject/fixtures',)

и используйте это, чтобы разместить мое приспособление initial_data.json, хранящее группы по умолчанию, необходимые для всего проекта. Это хорошо сработало для меня, поскольку я мог поддерживать чистоту дизайна, отделяя данные для каждого проекта от данных, специфичных для приложения.

Теперь в Django 1.7 initial_data фикстуры устарели, предлагает включить миграции данных вместе с миграциями схемы приложения; не оставляя очевидного выбора для глобальных исходных данных для каждого проекта.

Более того, новая среда миграции устанавливает все устаревшие фикстуры исходных данных до< /strong> выполнение миграции для совместимых приложений (включая приложение django.contrib.auth). Такое поведение приводит к тому, что мое приспособление, содержащее группы по умолчанию, не удается установить, поскольку таблицы auth_group еще нет в БД.

Любые предложения о том, как (элегантно) заставить фикстуры запускаться после всех миграций или, по крайней мере, после миграции приложений аутентификации? Или есть другие идеи по решению этой проблемы? Я нахожу фикстуры отличным способом предоставления начальных данных и хотел бы иметь простой и понятный способ объявления их для автоматической установки. Новый RunPython слишком громоздкий, и я считаю его избыточность для большинства целей; и кажется, что он доступен только для миграции для каждого приложения.


person knaperek    schedule 13.09.2014    source источник
comment
Поскольку это устарело, это, вероятно, будет немного неловко. Одним из вариантов может быть создание минимального приложения для загрузки только исходных данных, создание миграции и вызов в RunPython любых функций, которые Django использует для загрузки фикстур. Таким образом, вы также можете указать зависимости в своей миграции. Однако это, вероятно, потребует серьезного изучения исходного кода Django.   -  person Joar Leth    schedule 17.09.2014
comment
Да, я думал о создании какого-то мета-приложения в качестве крайней меры и создании там миграций (но это все равно некрасиво). Интересно, почему новый Django, по крайней мере, не предоставляет стандартного способа декларативного указания фикстур для загрузки вместе с новыми миграциями.   -  person knaperek    schedule 17.09.2014
comment
Где-то на SO было предложено повторно использовать файлы приспособлений json/xml до версии 1.7. У вас будет минимальное приложение только с переносом данных, затем вы проанализируете существующие фикстуры json/xml и создадите из них записи. В любом случае, это должно было случиться до 1.7.   -  person    schedule 09.10.2014


Ответы (2)


Если вы абсолютно хотите использовать фикстуры, просто используйте 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, так как вам не придется сталкиваться с проблемами целостности.

Источник.

person Antwan    schedule 14.11.2014
comment
Это правильный ответ, и он, кажется, исходит из отличного обсуждения этой темы. andrewsforge.com/article/upgrading-django-to-17/ - person shacker; 15.11.2014
comment
Я только что посмотрел выступление Эндрю Пинкхэма, который прекрасно все объясняет, так что это действительно кажется, это путь. Как он говорит: Система initial_data представляет собой проблему при использовании в тандеме с миграциями; вот почему система initial_data ушла, а фикстуры нет. - person knaperek; 18.11.2014
comment
предупреждение: показанная здесь команда 'flush' удалит все данные, а не только данные из прямой миграции - person wim; 17.12.2015

Я рекомендую использовать фабрики вместо фикстур, они беспорядочны и сложны в обслуживании, лучше использовать FactoryBoy с Django.

person codeadict    schedule 23.10.2014
comment
Я не думаю, что фикстуры сложны в обслуживании, до сих пор они были довольно любимым инструментом, и они являются встроенной функцией. Мне не очень удобно использовать стороннее приложение, такое как FactoryBoy, для такой простой задачи, как загрузка данных. Я думаю, что это перебор для этой цели. Ведь FactoryBoy предназначен для комплексного юнит-тестирования, как продвинутый генератор данных. Это далеко от моей цели - простой загрузчик статических данных. Но все равно спасибо за подсказку. - person knaperek; 24.10.2014