2013-09-09 3 views
1

У меня есть проект Django, который использует приложение South для обработки миграции схемы и данных. В одном из моих приложений у меня есть миграции (номер 0004), который отвечает за сантехнику загрузки данных из JSon файла:Не удалось загрузить светильники с югом в проекте Django

class Migration(DataMigration): 

    def forwards(self, orm): 
     from django.core.management import call_command 
     call_command("loaddata", "dummy_data.json") 

В том же проекте я пытаюсь добавить функциональность из «мягкого удаления», который нуждается в добавлении еще один подал , определяется как:

deleted_at = models.DateTimeField(blank=True, null=True) 

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

DatabaseError: Problem installing fixture 'C:/Users/Grzegorz/PycharmProjects/Dummy Project/Dummy\app_subapp\fixtures\dummy_data.json': Could not load app_subapp.DummyData(pk=1): (1054, "Unknown column 'deleted_at' in 'field list'") 

Это довольно странно, потому что эта ошибка возникает при применении миграции 0004, которая ранее работала нормально и из точки Южного процесса на этом шаге подана deleted_at не должна и не существует в моей базе данных. Я обнаружил, что перемещение миграции с загрузкой с этапа 0004 после 0009 решает проблему, но выглядит очень грязно и не очень хорошо подходит для решения этой проблемы.

Есть ли у вас есть советы, как я могу решить эту проблему и правильно обработать миграцию и привязку к югу?

ответ

0

Я нашел обходной путь к моей проблеме. Наконец, я извлек нагрузочные приспособления из Южной миграции и делегировал это действие Fabric. Теперь я разделил миграцию и загрузил исходные данные, поэтому все работает так, как я ожидаю.

+0

Если вы никогда не используете значения по умолчанию в полях отношений, это нормально, в противном случае вы * имеете * для работы с миграциями данных. –

0

Другое решения является загрузка файла арматуры и вставить его с помощью ORM Миграционного в:

from south.v2 import DataMigration 
import json 

class Migration(DataMigration): 

    def forwards(self, orm): 
     json_data=open("path/to/your/fixture.json") 
     items = json.load(json_data) 
     for item in items: 
      # Be carefull, this lazy line won't resolve foreign keys 
      obj = orm[item["model"]](**item["fields"]) 
      obj.save() 

     json_data.close() 

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

+0

Это нехорошо: обработка отношения не привязана к формату JSON. –

3

Я нашел фрагмент Django, который выполняет эту работу!

https://djangosnippets.org/snippets/2897/

Он загружает данные в соответствии с моделями, замороженных в креплении, а фактическое определение модели в коде приложений! Работает идеально для меня.

+0

В фрагменте есть опечатка ('get_mode' ->' get_model'), в противном случае это делает работу! (django 1.6). –

+0

Большое спасибо за это! –