Как загрузить initial_data (fixture) после миграции, а не после syncdb?

У меня есть скрипт bootstrap, который выполняет syncdb и migrate:

import settings
from django.core.management import setup_environ, call_command

setup_environ(settings)                                         # Setting up the env settings
call_command('syncdb', migrate=True, interactive=False)         # Sync the database

Предварительные требования:

  • django-south для миграции.

Идет процесс:

  • Фикстура initial_data содержит данные для модели, созданной миграциями.
  • syncdb выполняется, он создает все таблицы, кроме тех приложений, где существуют миграции.
  • После syncdb он пытается загрузить initial_data и выдает ошибку db not found, поскольку таблица для приложения с миграциями не была создана syncdb. [ Проблема ]
  • Затем он выполняет миграцию, которая создает базу данных.
  • Сообщение migration на этот раз автоматически загружает initial_data.

Проблема:

  • Как я могу избавиться от error, когда он пытается загрузить прибор для еще не созданной таблицы?
  • Могу ли я отредактировать приведенный выше скрипт таким образом, чтобы он загружал initial_data только после выполнения migration?

person Yugal Jindle    schedule 16.05.2012    source источник
comment
Думаю, это одна из причин, по которой юг не является частью джанго :)   -  person jpic    schedule 16.05.2012
comment
Вроде бы... но если бы это было так, то эта проблема была бы решена в первую очередь.   -  person Yugal Jindle    schedule 16.05.2012


Ответы (2)


Вы можете отключить загрузку исходных данных при syncdb:

call_command('syncdb', load_initial_data=False, interactive=False)
call_command('migrate', interactive=False)

Из исходного кода syncdb.py:

# Stealth option -- 'load_initial_data' is used by the testing setup                                                               
# process to disable initial fixture loading.                                                                                      
load_initial_data = options.get('load_initial_data', True)
person Wang Bin    schedule 16.05.2012
comment
Как мы можем отключить load_initial_data при запуске syncdb из командной строки? - person Yugal Jindle; 16.05.2012
comment
используйте переключатель --no-initial-data (также доступен для команды migrate) - person Florian; 11.10.2013

Есть несколько способов решить эту проблему:

  1. Исключите приложения из исходного дампа данных, просто вызвав приложения, для которых вы хотите заполнить данные.
  2. Можно попробовать эту библиотеку https://github.com/davedash/django-fixture-magic
  3. Вы можете написать пользовательскую команду управления для заполнения нужных вам моделей.
  4. Вы также можете использовать миграцию данных, которая поставляется с южным http://south.aeracode.org/docs/tutorial/part3.html

Лично я бы выбрал либо 1, либо 3. С первым пунктом сохраняйте приборы по отдельности в каждом приложении в папке с приборами. Тем не менее, это больно обновлять, если ваши модели меняются. Поэтому написание пользовательской команды управления может быть самым безболезненным.

person super9    schedule 16.05.2012