2015-03-19 3 views
0

У меня возникла проблема в Django 1.7 при попытке написать несколько миграций в строке. Вот основные настройки миграций:Вызов loaddata в Django 1.7 migrations бросает «Неизвестный столбец» [field] 'in' field list '"

  1. Initial миграция схема для создания модели для приложения
  2. миграции данных, которая вызывает LoadData на определенное приспособлении, который содержит один-время данных по умолчанию
  3. нового необязательного поля был добавлен в одну из моделей, поэтому нужно добавить поле

Если я сгенерирую первую миграцию, запустите ее, сгенерируйте вторую, запустите ее и добавьте новое поле, создайте третью миграцию , и запустите его, все в порядке. Однако, если моя база данных находилась в миграции №1, а затем я вытащился из исходного репозитория, переход 2 завершится неудачно, потому что он использует модели из models.py при вызове loaddata, а не с моделями на момент миграции. Затем он производит следующее сообщение об ошибке:

"Unknown column '[field]' in 'field list'" 

В этом случае [поле] это новое поле, которое я добавил для миграции # 3. Ошибка имеет смысл, потому что моя база данных еще не имеет нового поля, но loaddata ожидает, что она будет там (даже если устройство не ссылается на новое поле), но есть ли способ сделать loaddata использовать базу данных на время миграции, а не текущее состояние в models.py? Или есть ли другие способы обойти эту проблему?

Спасибо.

ответ

0

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

def load_fixture_in_data_migration(apps, schema_editor, fixture_filename, migration_file): 
""" 
Load fixture data in data migrations without breaking everything 
when the models change later on 
""" 
fixture_dir = os.path.abspath(os.path.join(os.path.dirname(migration_file), '../fixtures')) 
fixture_file = os.path.join(fixture_dir, fixture_filename) 

fixture = open(fixture_file, 'rb') 
objects = serializers.deserialize('json', fixture, ignorenonexistent=True) 
for obj in objects: 
    ObjApp = apps.get_model(obj.object._meta.app_label, obj.object._meta.object_name) 
    new_obj = ObjApp(pk=obj.object.pk) 
    for field in ObjApp._meta.fields: 
     setattr(new_obj, field.name, getattr(obj.object, field.name)) 
    new_obj.save() 
fixture.close() 

И я называю это так из миграции данных:

load_fixture_in_data_migration(apps, schema_editor, 'initial_add_ons.json', __file__) 

Кто-нибудь знает лучший способ сделать это? Это действительно похоже на хак, поскольку я должен получить доступ к мета-данным объекта, чтобы выполнить это.

 Смежные вопросы

  • Нет связанных вопросов^_^