Django.db.utils.OperationalError: нет такой таблицы при создании новой базы данных с нуля

Я удалил свою базу данных и все миграции и хотел бы восстановить их с нуля.

Когда я запускаю makemigrations, я получаю ошибку:

django.db.utils.OperationalError: no such table: registration_setting

Я смог отследить это до моего urls.py, который ссылается на несколько представлений. Если я закомментирую это, то миграции создаются нормально.

urlpatterns = [
    url(r'results', views.results, name='results'),
    url(r'all', views.results_all, name='results_all'),
    url(r'results_batch', views.results_batch, name='results_batch'),
    url(r'form', views.RegistrationFormView.as_view(), name='reg_form'),
    url(r'^$', views.login, name='login'),
    url(r'tokensignin', views.token_sign_in, name='token_sign_in'),
    url(r'logout', views.logout, name='logout'),
    url(r'^ajax/get_course_description$', views.get_course_description, name='get_course_description'),
    url(r'^not_registered_report', views.not_registered_report, name='not_registered_report'),
]

Насколько я могу судить, это строка из файла views.py

settings_CGPS_REG_TERM = Setting.objects.filter(key="CGPS_REG_TERM").first().value

Которая на самом деле ссылается на таблицу Settings, которая еще не была построена программой migrate. Но разве это не нормальная ситуация? Конечно, у меня есть код, который ссылается на значения, которые нужно получить из таблиц в моей базе данных. Почему makemigrations пытается выполнить любой код до создания таблиц базы данных? Есть ли какая-то лучшая практика, которой я не следую и которая вызывает это?

Я подозреваю, что строка в представлениях (settings_CGPS_REG_TERM ...) находится вне какой-либо функции и выполняется, когда django загружает представления для проверки кода python, перед запуском миграций.

Я думаю, что лучший подход - это метод класса для получения этого значения, когда оно нужно в вашем коде. Затем вы можете улучшить его с помощью кэша.

from django.core.cache import cache


CGPS_REG_TERM = "CGPS_REG_TERM"  # to avoid typo errors


class Setting(models.Model):
    # ...

    @classmethod
    def get_CGPS_REG_TERM(cls):
        val = cache.get(CGPS_REG_TERM)
        if not val:
            # next line fails if dont exists any object with the key
            val = cls.objects.filter(key=CGPS_REG_TERM).first().value
            cache.set(CGPS_REG_TERM, val, an_optional_timeout_in_seconds)
        return val



def my_view(request):
    method_that_needs_a_setting(Setting.get_CGPS_REG_TERM())
    # ...

Вернуться на верх