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())
# ...