@Nekr0z

Django ORM. Почему при создании миграций появляется ошибка OperationalError: no such table?

При выполнении manage.py makemigrations появляется ошибка о том, что таблица (на которую надо сделать миграцию) не существует:
Список вызовов
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line
    utility.execute()
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\__init__.py", line 359, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\base.py", line 294, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\base.py", line 342, in execute
    self.check()
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\base.py", line 374, in check
    include_deployment_checks=include_deployment_checks,
  File "D:\enviropments\NewElion\lib\site-packages\django\core\management\base.py", line 361, in _run_checks
    return checks.run_checks(**kwargs)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\checks\registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\checks\urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "D:\enviropments\NewElion\lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver
    for pattern in resolver.url_patterns:
  File "D:\enviropments\NewElion\lib\site-packages\django\utils\functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\enviropments\NewElion\lib\site-packages\django\urls\resolvers.py", line 313, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "D:\enviropments\NewElion\lib\site-packages\django\utils\functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "D:\enviropments\NewElion\lib\site-packages\django\urls\resolvers.py", line 306, in urlconf_module
    return import_module(self.urlconf_name)
  File "D:\Python27\Lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "D:\YandexDisk\WORK!\Projects Django\test\Elion\Elion\urls.py", line 5, in <module>
    from about import views as about_views
  File "D:\YandexDisk\WORK!\Projects Django\test\Elion\about\views.py", line 6, in <module>
    from .forms import ContactMessageForm, SubmitApplication
  File "D:\YandexDisk\WORK!\Projects Django\test\Elion\about\forms.py", line 42, in <module>
    class SubmitApplication(forms.Form):
  File "D:\YandexDisk\WORK!\Projects Django\test\Elion\about\forms.py", line 43, in SubmitApplication
    regions = [(obj.id, obj.region) for obj in AreasWork.objects.all()]
  File "D:\enviropments\NewElion\lib\site-packages\django\db\models\query.py", line 256, in __iter__
    self._fetch_all()
  File "D:\enviropments\NewElion\lib\site-packages\django\db\models\query.py", line 1087, in _fetch_all
    self._result_cache = list(self.iterator())
  File "D:\enviropments\NewElion\lib\site-packages\django\db\models\query.py", line 54, in __iter__
    results = compiler.execute_sql()
  File "D:\enviropments\NewElion\lib\site-packages\django\db\models\sql\compiler.py", line 835, in execute_sql
    cursor.execute(sql, params)
  File "D:\enviropments\NewElion\lib\site-packages\django\db\backends\utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "D:\enviropments\NewElion\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "D:\enviropments\NewElion\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "D:\enviropments\NewElion\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "D:\enviropments\NewElion\lib\site-packages\django\db\backends\sqlite3\base.py", line 337, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: AreasWork
В этом списке вызовов показано, что вызывается forms.py этого приложения в том месте где есть обращение к данной таблице:
# Elion\about\forms.py:
class SubmitApplication(forms.Form):
    regions = [(obj.id, obj.region) for obj in AreasWork.objects.all()] # Ошибка в этой строке
    choice_region = [(None, 'Выберите город')] + regions + [('0', 'Другой')]
    region = forms.ChoiceField(label='Область', choices=choice_region,
                               widget=forms.Select(attrs={'class': 'form-control'}))
    ............

Если в этом месте убрать обращение к БД, то ошибок больше никаких не появляется. Даже после выполнения manage.py migrate и в forms.py вернуть код обратно, то всё будет работать нормально, без ошибок.

Также, я нашёл, что у кого-то была аналогичная проблема и тоже ошибка в файле forms.py при обращении к БД.

Понятно, что для решения проблемы, надо тупо убрать обращение к БД в форме, но мне интересно, почему вообще такое происходит и что я делаю не правильно?
  • Вопрос задан
  • 5587 просмотров
Решения вопроса 1
timofeydeys
@timofeydeys
Свобода творцов
Потому что при простом python manage.py makemigrations полностью поднимается окружение с сетингами. А т.к. forms.py где то импортиться, то джанга при старте его видит, а в БД таблику не видит. Потому и ошибка.
Надо сначала писать модельки, потом миграции, потом все остальное. Либо Пока не сделаны миграции, не обращаться к БД. Ты своей AreasWork.objects.all() формируешь запрос к БД, вот и все.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы