Содержание
Данная глава временно взята из первой версии книги и подлежит корректировке. Вы можете помочь с этим!
Перевод © Попов Руслан <radz • yandex • ru>
Django хорошо подготовлен для так называемой полевой разработки, т.е., для создания проекта с нуля. Но несмотря на этот факт, существует возможность использовать Django совместно с унаследованными базами данных и приложениями. В данной главе рассматривается несколько стратегий такого использования.
Слой Django, предназначенный для поддержки баз данных, генерирует SQL схему базы данных по коду модели, но когда вы сталкиваетесь с унаследованной базой данных, то у вас уже есть схема. В этом случае вам потребуется создать модели для каждой существующей таблицы. Для решения такой задачи Django поставляется с утилитой, которая может генерировать код модели по описанию таблицы в базе данных. Данная утилита называется inspectdb и вы можете вызывать её с помощью команды:
python manage.py inspectdb
Утилита inspectdb просматривает базу данных, указанную в вашем конфигурационном файле, определяет представление модели для каждой таблицы и выводит код модели на стандартный вывод.
Ниже представлено пошаговое описание обычного процесса интегрирования унаследованной базы данных. Описание предполагает, что Django уже установлен и что в наличии есть унаследованная база данных.
Создать проект Django с помощью команды python manage.py startproject mysite, где mysite является именем проекта.
Отредактировать конфигурационный файл проекта,
mysite/settings.py
, внеся в него правильные параметры соединения с базой данных. За подробностями обратитесь к главе «Модели».Создать приложение внутри проекта с помощью команды python manage.py startapp myapp, где myapp является именем приложения.
Выполнить команду python manage.py inspectdb. Команда выведет код модели для каждой таблицы базы данных. Просмотрите этот вывод.
Сохранить вывод в файл
mysite/myapp/models.py
:python mysite/manage.py inspectdb > mysite/myapp/models.py
Отредактировать файл
mysite/myapp/models.py
, приведя его в нужный вид.
Как вы можете ожидать, процесс генерации моделей по описанию таблиц не является идеальным и вам может потребоваться немного «почистить» полученный результат. Вот несколько советов:
Каждая таблица базы данных описывается в виде модели. Это означает, что потребуется провести рефакторинг моделей для преобразования таблиц типа «многие-ко-многим» в объекты
ManyToManyField
.Каждая созданная модель имеет атрибуты для каждого поля, включая поле id. Однако, следует помнить, что Django автоматически добавляет поле id primary key, если модель не содержит первичного ключа. Следовательно, вы пожелаете удалить строки подобные этой:
id = models.IntegerField(primary_key=True)
Такие строки не только избыточны, но они также могут вызвать проблемы в случае, если ваше приложение будет добавлять «новые» записи в эти таблицы. Утилита inspectdb не может надежно определить является ли поле автоинкрементным, таким образом данная задача ложится на вас, используйте AutoField когда это необходимо.
Каждый тип поля (т.е., CharField, DateField) определяется с помощью описания данного поля (т.е., VARCHAR, DATE). Если утилита inspectdb не может точно определить тип поля, она использует TextField и добавляет комментарий «Данный тип поля является предположением.» («This field type is a guess.») после поля. Обращайте внимания на такие поля и изменяйте их тип при необходимости.
Если для поля таблицы невозможно подобрать эквивалент в виде поля модели, можно вообще его не указывать. Слой Django для работы с моделями не требует, чтобы было описано каждое поле таблицы.
Если имя поля таблицы совпадает с зарезервированным словом языка Python (например, pass, class или for), утилита inspectdb добавит суффикс _field к имени поля и установит атрибуту db_column реальное значение имени поля.
Например, если таблица содержит целочисленное поле с именем for, сгенерированная модель будет содержать такое определение для этого поля:
for_field = models.IntegerField(db_column='for')
Утилита inspectdb добавит комментарий «Поле было переименовано, так как имя конфликтовало с зарезервированным словом языка Python.» («Field renamed because it was a Python reserved word.») после поля.
Если в базе данных есть таблицы, которые ссылаются на другие таблицы (как это происходит в большинстве баз данных), вам может потребоваться изменить порядок описания моделей в файле. Например, если модель Book ссылается на модель Author, то модель Author должна быть определена до модели Book. Если требуется создать ссылку на модель, которая ещё не была определена, вы можете использовать имя модели, а не сам объект модели.
Утилита inspectdb определяет первичные ключи для таблиц следующих баз данных: PostgreSQL, MySQL и SQLite. Следовательно, в модели будет внесено primary_key=True, там где это необходимо. Для остальных баз данных вам потребуется вручную внести это определение в определённое поле каждой модели, так как Django требует определения первичного ключа для каждой модели.
Определение ссылок работает только с PostgreSQL и с некоторыми типами таблиц MySQL. В остальных случаях такие поля будут сгенерированы как «IntegerField's, assuming the foreign-key column was an INT column».
0 комментариев | Оставьте комментарий