Почему страница модели Django Admin поднимает исключение FieldDoesNotExist после успешной миграции?
Ломаю голову над этим вопросом. Я просто добавил новое поле в модель.
class Image(BaseModel):
url = models.URLField(max_length=1000, null=True)
content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
# new field added below
class Type(models.TextChoices):
HEADER = 'HEADER', _('Header')
type = models.CharField(
max_length=20,
choices=Type.choices,
null=True,
blank=True
)
class Meta:
db_table = 'Image'
Затем я выполнил python manage.py makemigrations, а затем python manage.py migrate. Это прошло успешно, и я могу видеть новое поле в таблице в моей базе данных. Информация из таблицы django_migrations выглядит корректно.
Вот мой файл миграции:
# Generated by Django 3.0.5 on 2022-03-23 12:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('example', '0082_auto_20220322_1937'),
]
operations = [
migrations.AddField(
model_name='image',
name='type',
field=models.CharField(blank=True, choices=[('HEADER', 'Header')], max_length=20, null=True),
),
]
Проблема, с которой я столкнулся, заключается в том, что когда я посещаю страницу модели в админке django, я получаю внутреннюю ошибку сервера со следующим:
Я много раз пытался отменить миграцию и запустить ее заново. Я также просмотрел другие подобные вопросы, но ни одно из решений не сработало и не решило мою конкретную проблему.
Почему это происходит?
Не могу комментировать из-за репутации, извините
- давайте посмотрим, что такое 'BaseModel' .
- Ошибка возникает после добавления нового поля?
Я подозреваю, что добавление нового поля не является причиной проблемы - это просто совпадение, что проблема возникла в то же время, когда вы внесли это изменение. Разгадка кроется в обратном отслеживание:
File "/usr/local/lib/python3.9/site-packages/django/contrib/contenttypes/fields.py", line 243, in __get__
rel_obj = ct.get_object_for_this_type(pk=pk_val)
File "/usr/local/lib/python3.9/site-packages/django/contrib/contenttypes/models.py", line 175, in get_object_for_this_type
return self.model_class()._base_manager.using(self._state.db).get(**kwargs)
AttributeError: 'NoneType' object has no attribute '_base_manager'
Конкретно, ошибка исходит от фреймворка contenttypes - т.е. ваше поле content_type нарушено по крайней мере на одном существующем экземпляре модели в базе данных. Метод model_class() возвращает нулевое значение вместо класса модели.
Наиболее вероятной причиной этого является то, что вы удалили модель, на которую ранее ссылался ваш общий внешний ключ, или вы удалили приложение, которое предоставляло эту модель из INSTALLED_APPS.
Вы должны быть в состоянии решить проблему, выполнив команду управления remove_stale_contenttypes. Если это не сработает, то, вероятно, придется вручную проверить базу данных, чтобы выяснить, где проблема (очистка всей базы данных также поможет проверить, в этом ли дело).
Исключение FieldDoesNotExist не является проблемой. Оно было бы правильно обработано Django, если бы не проблема с вашими типами содержимого.
Примечание: я не думаю, что это имеет отношение к вашей проблеме, но это не очень хорошая идея использовать имена, которые конфликтуют со встроенными функциями Python , так как это может привести к запутанному поведению.