Я иду странным путем, но это результат обстоятельств.
Мне пришлось сгенерировать один файл models.py из существующей базы данных postgres с помощью inspect_db.
Затем я исправляю некоторые поля (была небольшая проблема с ключами) и создаю 2 приложения внутри этого проекта. Итак, теперь у меня есть 3 models.py (это разделенные models.py, которые были сгенерированы inspect_db). Добавлен managed = True. Классы имеют те же ссылки и типы данных, что и в базе данных.
Далее я хочу интегрировать эти модели в существующую базу данных. Я делаю миграцию, я мигрирую, и в итоге в БД есть только системные таблицы django (auth_, django_migrations и т. д.) Ни одной из моих классов (хотя файлы миграции были созданы). Итак, я попытался удалить каталоги миграции и повторить makemigrations и migrate, но терминал выдал это:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
No migrations to apply.
(forest-venv) user@user-HP-Z800-Workstation ~/MyProjects/forest-venv/lesoved $ python manage.py runserver 8001
Performing system checks...
Если я попытаюсь снова выполнить миграцию - никаких изменений. Я попытался удалить информацию о своих приложениях в таблице django_migrations - безрезультатно.
Итак, мои вопросы: - Можно ли интегрировать новые модели в существующую базу данных (если имена, ключи и форматы в порядке)? - Возможна ли интеграция по способу сохранения данных из существующей базы данных после миграций? - Как вернуть возможность миграции? теперь это не работа.
@dirkgroten, так что, если я внес изменения в модель перед миграцией и миграцией, я не буду интегрировать модели в существующую базу данных?
Нет, сначала вам нужно убедиться, что ваше текущее состояние миграции соответствует вашему состоянию базы данных. В противном случае вы не сможете запустить режим fake. Кстати, вы должны убедиться, что в вашей базе данных нет миграций (таблица django-migrations), прежде чем начать.
@dirkgroten спасибо! Итак, если я правильно вас понял, мне нужно: 1) сгенерировать inspect_db models.py; 2) не изменять этот файл models.py и делать миграцию; 3) выполнить migrate <app> --fake и выполнить миграцию целиком; 4) Затем, в конце концов, я могу разделить этот файл models.py на несколько моделей в разных приложениях моего проекта. Да?
Замечательно, все работают! Спасибо @dirkgroten и документации django!






Хитрость при использовании существующей базы данных заключается в том, чтобы убедиться, что вы начинаете с четко определенного состояния: сначала установите Django в то же состояние, что и ваша база данных, и только после этого начните вносить изменения в свои модели. Итак, вот шаги:
django-migrations, при необходимости удалите ее с помощью SQL. (Примечание: я предполагаю, что эта база данных не создается Django для начала, и вы создаете новое приложение django)inspectdb. При необходимости переименуйте модели, чтобы они имели правильный CamelCase. Если вы переименовываете модели или поля, которые изменят имя таблицы или столбца в базе данных, обязательно установите db_table (опции Meta вашей модели) и db_column (как атрибут поля).manage.py makemigrations. Проверьте файлы миграции для ваших моделей, просто чтобы убедиться, что имена совпадают с вашими базами данных.manage.py migrate <app> --fake. Это добавит миграции в таблицу django-migrations в вашей базе данных, как если бы они выполнялись, но фактически не запускали их.manage.py migrate, чтобы создать таблицы, предоставленные django (auth, contenttype, session и т. д.).makemigrations, он должен создать миграцию только для ваших изменений.
Сначала вам нужно достичь состояния, в котором ваши модели и миграции соответствуют вашей базе данных. Ничего не меняйте в моделях производства
inspectdb. Если ваши модели соответствуют вашей базе данных, вам следует использоватьmakemigrations, затем для ваших приложений запуститеmigrate <app> --fake, а затемmigrate(для приложений django, если в вашей базе данных нетauthи т. д.). Затем вы можете начать менять модели и выполнять миграцию, как обычно.