Я получаю ошибку "Нет такого столбца" только при выполнении тестов
Возможно, это упускает некоторые ключевые детали и показывает мою относительную новизну в django, но я попытался изолировать свою проблему до наименьшего количества шагов, чтобы воспроизвести проблему.
Состояние запуска: Приложение работает нормально, все тесты пройдены.
- Добавьте один столбец с нулевым значением в существующую модель.
- makemigrations
- 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+ и миграции данных