Как удалить поле в модели Django - вариант ответа на вопрос - PullRequest
0 голосов
/ 30 августа 2018

Хотя пара похожих вопросов была опубликована, ни один из этих вопросов не совпадает с моим делом.

У меня была модель, которая выглядела так:

class Person(models.Model):
"""Definition of persons that will fulfill a role in a committee
or will be in a way associated with a committee as an administrator
"""
ClientId = models.ForeignKey('clients.Client', on_delete=models.CASCADE,
                             to_field='id')
PersNumber = models.PositiveIntegerField(null=False)
PersSurName = models.CharField(max_length=40, null=False)
PersNames = models.CharField(max_length=40, null=False)

Я установил уникальность записи в ClientId и PersNumber.

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

Я удалил PersNumber из моей модели и запустил makemigrations.

Все хорошо, пока я не побежал мигрировать ...

Я получаю следующую ошибку:

django.core.exceptions.FieldDoesNotExist: Person has no field named 'PersNumber'

Любая идея о том, как обойти эту ошибку

Полный след выглядит так:

Operations to perform:

Применение всех миграций: администратор, аутентификация, клиенты, типы контента, komadm_conf, сеансы Запущенные миграции: Применение komadm_conf.0017_auto_20180830_1806 ... обратная связь (последний вызов был последним): Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ models \ options.py", строка 564, в поле get_field вернуть self.fields_map [field_name] KeyError: 'PersNumber'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): Файл "manage.py", строка 15, в execute_from_command_line (sys.argv) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management__init __. Py", строка 381, в execute_from_command_line utility.execute () Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management__init __. Py", строка 375, в строке выполнения self.fetch_command (субкоманда) .run_from_argv (self.argv) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management \ base.py", строка 316, в run_from_argv self.execute (* args, ** cmd_options) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management \ base.py", строка 353, в исполнении output = self.handle (* аргументы, ** параметры) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management \ base.py", строка 83, в оболочке res = handle_func (* args, ** kwargs) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ core \ management \ команды \ migrate.py", строка 203, в дескрипторе fake_initial = fake_initial, Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ migrations \ executor.py", строка 117, в миграции state = self._migrate_all_forwards (состояние, план, full_plan, fake = fake, fake_initial = fake_initial) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ migrations \ executor.py", строка 147, в _migrate_all_forwards state = self.apply_migration (состояние, миграция, фальшивка = фальшивка, fake_initial = fake_initial) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ migrations \ executor.py", строка 244, в apply_migration состояние = миграция.apply (состояние, schema_editor) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ migrations \igration.py", строка 124, в приложении operation.database_forwards (self.app_label, schema_editor, old_state, project_state) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ migrations \ operations \ fields.py", строка 150, в database_forwards schema_editor.remove_field (from_model, from_model._meta.get_field (self.name))Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ schema.py", строка 318, в поле remove_field self._remake_table (модель, delete_field = поле) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ schema.py", строка 257, в _remake_table self.create_model (temp_model) Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ backends \ base \ schema.py", строка 300, в create_model columns = [model._meta.get_field (field) .column для поля в полях] Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ backends \ base \ schema.py", строка 300, в columns = [model._meta.get_field (field) .column для поля в полях] Файл "C: \ ApplicationDef \ za \ co \ drie_p \ Komadmin.db \ KomAdmin \ KomadmTest \ komadm_app \ komadm_env \ lib \ site-packages \ django \ db \ models \ options.py", строка 566, в поле get_field поднять FieldDoesNotExist («% s не имеет поля с именем«% s »»% (self.object_name, field_name)) django.core.exceptions.FieldDoesNotExist: у человека нет поля с именем 'PersNumber'

1 Ответ

0 голосов
/ 03 сентября 2018

Учитывая тот факт, что никто не ответил, я буду (но я тоже учусь) ..

Вы проверили, существует ли это поле еще? (в оболочке например).

Я рекомендую вручную удалить связанный файл миграции и повторить попытку (makemigrations + migrate).
Файл миграции, о котором я говорю, может быть найден MyProject / Myapp / migrations / 00xx_something.py

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...