Я получаю ошибку "Нет такого столбца" только при выполнении тестов

Возможно, это упускает некоторые ключевые детали и показывает мою относительную новизну в django, но я попытался изолировать свою проблему до наименьшего количества шагов, чтобы воспроизвести проблему.

Состояние запуска: Приложение работает нормально, все тесты пройдены.

  1. Добавьте один столбец с нулевым значением в существующую модель.
  2. makemigrations
  3. migrate

Новое состояние: Приложение работает нормально, запуск тестов приводит к ошибке.

Creating test database for alias 'default'...
Found 23 test(s).
Installed 5 object(s) from 1 fixture(s)
Traceback (most recent call last):
  File "/home/f/.virtualenvs/mgmt/lib/python3.10/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "/home/f/.virtualenvs/mgmt/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py", line 357, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: recommended_for_text

recommend_for_text - это имя нового столбца.

recommended_for_text = models.CharField(null=True, blank=True, max_length=256)

Он отображается в моем представлении в приложении, как и ожидалось, только запуск тестов вызывает у меня проблему.

Ваша команда 0015_migration очень проблематична. Как правило, не следует вызывать команду loaddata из миграции, поскольку она будет использовать текущую модель, а не историческую модель, что означает, что миграция может работать, когда вы только добавили ее, но может не сработать в будущем, когда в модель будут внесены дополнительные изменения.

На данный момент вы можете сделать следующее:

В 0015_migration замените load_plans в аргументах к RunPython на RunPython.noop:

from django.db import migrations


class Migration(migrations.Migration):
    dependencies = [
        ("sites", "0014_sitecommandlog_note"),
    ]

    operations = [
        migrations.RunPython(migrations.RunPython.noop),
    ]

Далее, если вы действительно хотите использовать команду loaddata, делайте это извне, из системы миграций. Если вы действительно хотите загружать данные через миграции, подумайте о создании миграций данных, которые не зависят от команды loaddata. Если вы хотите загружать фикстуры с помощью миграций данных, вы можете эмулировать работу команды loaddata, следуя указаниям в этом вопросе: Загрузка исходных данных с помощью Django 1.7+ и миграции данных

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