Django 1.3 и южные миграции

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

После обновления до Django 1.3 наши модульные тесты больше не запускаются, потому что они не могут найти данные, на которые они полагаются.

  1. Это поведение связано с одно из обратно несовместимых изменений в 1.3
  2. Есть ли простой способ преобразовать все эти миграции в фикстуры?

person Craig Blaszczyk    schedule 05.07.2011    source источник
comment
Возможно, вы могли бы попробовать удалить папку migrations в каждом каталоге приложения и запустить ./manage.py schemamigration app --initial? Сначала сделайте резервную копию всего, потому что это может сработать, а может и не сработать.   -  person Zhehao Mao    schedule 05.07.2011
comment
Это сработает для моих модульных тестов, но сломает мои производственные системы!   -  person Craig Blaszczyk    schedule 06.07.2011


Ответы (2)


  1. Да, такое поведение связано с этим изменением.

    Похоже, что в южной магистрали есть обходной путь (см. changeset/21a635231327 ), поэтому вы можете попробовать версию для разработки South (по моему опыту, она довольно стабильна).

  2. Вы можете попробовать изменить имя БД в настройках (чтобы получить чистую среду), запустить ./manage.py syncdb и ./manage.py migrate, а затем выполнить ./manage.py dumpdata

person Mikhail Korobov    schedule 05.07.2011
comment
По состоянию на 19 января 2012 г. до сих пор не выпущен южный релиз с этим исправлением, но вы можете установить южный из магистрали с помощью: pip install hg+https://bitbucket.org/andrewgodwin/south Но - это не решает проблему настолько далеко как я могу сказать... - person hwjp; 19.01.2012

Я ударил эту проблему сегодня. В конце концов я закончил рефакторинг своих миграций, чтобы они использовали вспомогательные функции для фактической вставки данных, а затем вызывали те же функции из setUp() моих тестов.

Некоторые подсказки;

  • Сделайте так, чтобы ваши вспомогательные функции принимали класс модели в качестве аргумента, чтобы вы могли вызывать их с помощью orm['yourapp.YourModel'] из миграции и с помощью models.YourModel из теста. Это также показывает основное ограничение: South работает с моделями, схема которых изменилась с тех пор, тестовый код не может этого сделать. Мне повезло, что эта конкретная модель не изменилась.

  • Если вы хотите сохранить вспомогательные методы внутри миграций, вы обнаружите, что не можете напрямую импортировать yourapp.migrations.0001_some_migration, потому что идентификаторы не могут начинаться с цифр. Используйте что-то вроде migration_0001 = importlib.import_module('yourapp.migrations.0001_some_migration') вместо оператора импорта.

person RemcoGerlich    schedule 26.03.2013