В документации Django есть именно этот случай как применение операции migrations.SeparateDatabaseAndState. Я сделал именно то, что сказано в документации, но Django продолжал выдавать исключение, говоря, что таблица, используемая для сопоставления M2M, не существует.
Я назначал имя таблицы через атрибут «db_table» класса Meta промежуточной модели, и это вызывало проблему (не знаю почему). Затем я понял, что код SQL, показанный в примере в документации Django, предназначен для изменения имени, присвоенного Django таблице отношений M2M в стандартном отношении M2M, на новое имя, присвоенное Django таблице, соответствующей используемой промежуточной модели.
database_operations=[
# Old table name from checking with sqlmigrate, new table
# name from AuthorBook._meta.db_table.
migrations.RunSQL(
sql='ALTER TABLE core_book_authors RENAME TO core_authorbook',
reverse_sql='ALTER TABLE core_authorbook RENAME TO core_book_authors',
),
],
В этом примере «core_book_authors» — это старое имя, а «core_authorbook» — это новое имя таблицы отношений M2M. Если вы не включите этот код в миграцию, вы не сможете добавить дополнительные поля в промежуточную модель (и я предполагаю, что это основная причина создания пользовательских отношений M2M), поскольку Django будет искать новое имя таблицы. .
Подводя итог тому, что я сделал, чтобы изменить стандартное отношение M2M на пользовательское, используя «через»:
- Создал промежуточную модель без дополнительных полей (только два внешних ключа) и указал, что отношения M2M теперь должны выполняться через эту модель (используя «через»).
- Запустите команду
py manage.py makemigrations
. Я изменил эту автоматически сгенерированную миграцию, чтобы она выглядела как в документации, указанной выше.
- Выполните команду
py manage.py migrate
.
- Добавил все дополнительные поля, которые мне были нужны в промежуточной модели.
- Выполните команду
py manage.py makemigrations
.
- Выполните команду
py manage.py migrate
.
Таблица, которая ранее представляла стандартную связь M2M, теперь будет иметь другое имя и все новые столбцы. Важно, чтобы эти столбцы имели значение по умолчанию, если у вас уже были данные в таблице. Я считаю, что это самый простой способ сделать это БЕЗ потери каких-либо данных.
person
Zufra
schedule
05.06.2020