Django код запуска (например, начальное кеширование) конфликтует с makemigrations. Операционные ошибки нет таких столбцов в таблицах - PullRequest
0 голосов
/ 05 мая 2020

Во-первых, я не фанат «делай как django». Вместо того, чтобы тратить часы на изучение метода django, я предпочитаю использовать свои базовые c знания программирования при разработке приложения. Справочная информация:

  • Приложение, которое я разрабатываю, представляет собой серверную часть REST, которая хранит значения локализации, такие как информация о языке.
  • Я хочу взять информацию о языке, которая хранится в базе данных, и загрузить ее в память один раз при запуске, а затем передать эти данные из памяти при поступлении запроса.
  • Я создал свою модель

    class Text(models.Model):
        language = models.CharField()
        key = models.CharField()
        text = models.CharField()

  • Затем запустил python manage.py makemigrations и перенести команды как обычный шаг
  • Затем я продвинулся вперед, реализовал свой код кеширования и поместил его прямо в admin.py (это может быть urls.py, это не имеет значения, его нужно запустить только один раз)

    cached_languages = models.Text.objects.all()

  • Я go вперед и запускаю свое приложение, и оно работает нормально.
  • Затем я хотел добавить поле в свою текстовую модель, например

    class Text(models.Model):
        language = models.CharField()
        key = models.CharField()
        text = models.CharField()
        **dummy = models.CharField()**

  • Затем нажимаем python manage.py makemigrations и boom в строке
cached_languages = models.Text.objects.all()

Получаем ошибку говоря, что sqlite3.OperationalError: нет такого столбца: app_ text.dummy

Что мне делать, чтобы это исправить?

1 Ответ

0 голосов
/ 05 мая 2020

Проблема в том, что django выполняет каждую строку написанного кода, даже когда вы вызываете python manage.py makemigrations . Это означает, что до того, как django фактически отражает изменения в базе данных, он выполняет весь проект, а когда дело доходит до строки кеширования, он пытается получить все строки из текстовой таблицы, в которой еще нет столбца фиктивный , но из django таблица перспективы (в коде) Text имеет фиктивный столбец, поэтому выдает ошибку.

Решение Обходной путь - установить флаг, скажем, в settings.py

IS_RUNNING = False

и в manage.py добавьте следующее

from app import settings
if 'runserver' in sys.argv:
    settings.IS_RUNNING = True

и поместите код кеша после проверки флага

if settings.IS_RUNNING:
     cached_languages = models.Text.objects.all()

тогда django не будет пытаться получить записи, пока выполняя миграции перед их применением. Алгоритм кеширования будет выполняться только тогда, когда вы действительно вызываете runserver.

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