Вопрос:

Django не может делать миграции после изменения имени приложения и таблиц БД

django

610 просмотра

5 ответа

582 Репутация автора

Я работаю с Django 1.11.5 и использую PyCharm в качестве своей IDE. Я пытался изменить название моего приложения с «клинических испытаний» на «рак_триалов». PyCharm обновил все мои файлы проекта соответственно. Затем я следовал инструкциям в этом ответе SO, чтобы обновить соответствующие таблицы базы данных. Тем не менее, я получаю следующую ошибку при попытке запустить makemigration. Я не могу понять, что это значит и / или какую часть я здесь упускаю.

    > python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Python_3.6.1\lib\site-packages\django\core\management\__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "C:\Python_3.6.1\lib\site-packages\django\core\management\__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Python_3.6.1\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Python_3.6.1\lib\site-packages\django\core\management\base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "C:\Python_3.6.1\lib\site-packages\django\core\management\commands\makemigrations.py", line 150, in handle
    loader.project_state(),
  File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\loader.py", line 323, in project_state
    return self.graph.make_state(nodes=nodes, at_end=at_end, real_apps=list(self.unmigrated_apps))
  File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\graph.py", line 409, in make_state
    project_state = self.nodes[node].mutate_state(project_state, preserve=False)
  File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\migration.py", line 92, in mutate_state
    operation.state_forwards(self.app_label, new_state)
  File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\operations\fields.py", line 142, in state_forwards
    for name, instance in state.models[app_label, self.model_name_lower].fields:
KeyError: ('cancer_trials', 'cancer_trials')

Вот функция, которая выдает ошибку

def state_forwards(self, app_label, state):
    new_fields = []
    old_field = None
    for name, instance in state.models[app_label, self.model_name_lower].fields:
        if name != self.name:
            new_fields.append((name, instance))
        else:
            old_field = instance
    state.models[app_label, self.model_name_lower].fields = new_fields
    # Delay rendering of relationships if it's not a relational field
    delay = not old_field.is_relation
    state.reload_model(app_label, self.model_name_lower, delay=delay)
Автор: pheeper Источник Размещён: 03.01.2018 03:51

Ответы (5)


1 плюс

107 Репутация автора

  1. Удалите все файлы миграции в вашем проекте. Перейдите в каждую папку миграции приложений вашего проекта и удалите все внутри, кроме файла init .py.

  2. Удалите текущую базу данных или удалите db.sqlite3, если это ваш случай.

  3. Создайте начальные миграции и сгенерируйте схему базы данных.
  4. попробуйте запустить еще раз migrationsa и перенести комманов
Автор: Adi Ep Размещён: 03.01.2018 05:26

0 плюса

107 Репутация автора

Хорошо, если вы хотите сохранить существующую базу данных, может быть, вам поможет это руководство: https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html (сценарий 2)

Автор: Adi Ep Размещён: 03.01.2018 08:10

2 плюса

1919 Репутация автора

По моему опыту, самое простое решение - создать новое приложение и скопировать код:

  1. Создайте новое приложение с нужным именем и добавьте его в настройки
  2. Скопируйте / вставьте код из старого приложения в новое приложение, измените ссылки со старого приложения на новое приложение, запустите makemigrations и мигрируйте
  3. Открыть базу данных и скопировать данные из старых таблиц в новые таблицы
  4. Проверьте, что все работает в новом приложении
  5. Ищите stackoverflow.com или Google, как удалить приложение из проекта или просто оставить там. К сожалению, я не на 100% уверен в этих шагах, кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь, но, насколько я помню:

    • запустите python manage.py migrate old_app zero (это отменяет все миграции для приложения)
    • удалить приложение из настроек
    • удалить файлы
Автор: Borut Размещён: 03.01.2018 08:42

0 плюса

3512 Репутация автора

Хороший ответ о том, как правильно перемещать данные между приложениями, можно найти здесь .

Что сработало для меня следующее:

  1. Экспорт данных в JSON

    ./manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude admin.LogEntry --exclude sessions --indent 2 > <path_out_of_the_project>/db.json
    
  2. Откройте db.jsonфайл с помощью редактора и переименуйте все экземпляры old app nameв the new app name.

  3. Переименуйте ваше приложение и все необходимые ссылки в ваш код.

  4. Удалите базу данных и создайте новую пустую, применив все миграции.

  5. Загрузите данные из db.jsonфайла, который включает new appимя.

    ./manage.py loaddata <path_out_of_the_project>/db.json
    
Автор: raratiru Размещён: 08.02.2018 12:03

0 плюса

11 Репутация автора

простой подход:

Вручную удалите все миграции в приложениях, зайдя в каталог «Migrations» каждого приложения. Примечание: удаление init .py в именованном каталоге 'Migrations' не повредит.

Выше «appname» - приложения, взятые по одному и перенесенные с помощью описанных выше шагов. Для новых добавленных приложений будет отображаться только перенесенная таблица для следующих двух команд 'migrate' и 'sqlmigrate'.

После этого:

$: python manage.py makemigrations имя приложения

$: python manage.py перенести имя приложения

$: python manage.py sqlmigrate имя приложения 0001

Автор: Ank_247shbm Размещён: 20.05.2019 08:27
Вопросы из категории :
32x32