Сгенерируйте несколько моделей из существующей базы данных в Django
-
23-09-2019 - |
Вопрос
Я знаю, что это существует
django-admin.py inspectdb > models.py
Однако есть ли простой способ ограничить это?Без ручного удаления того, что мне не нужно.
Я подключаюсь к базе данных, которая содержит более ста таблиц, но мне нужны модели примерно из 4 или 5.Есть ли простой способ сгенерировать модели из нескольких заданных таблиц?
Это довольно большие таблицы, так что мне тоже не хочется печатать их все.
Решение
Я только что сделал это сам, тоже с Oracle.Это возможно - но некрасиво.
Предполагая, что вы знаете названия таблиц, которые вам нужны -
Открыть django/db/backends/oracle/introspection.py
.Существует функция get_table_list
:
def get_table_list(self, cursor):
"Returns a list of table names in the current database."
cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
return [row[0].lower() for row in cursor.fetchall()]
Просто замените его чем-то вроде
def get_table_list(self, cursor):
names = ['mytable1', 'mytable2', 'mytable3']
return names
Затем запустите свой inspectdb
и это будет намного более управляемо :)
Другие советы
Не используйте syncdb > models.py
.Это не очень хорошая практика.Создавайте свои модели вручную и добавляйте managed=False
к этому.Если вы не добавите его, все ваши таблицы базы данных могут быть удалены с помощью одной команды.После создания ваших моделей запустите syncdb
чтобы таблицы были связаны.
Следующее решение, предоставленное @pfctdayelise
Для django 1.8
серверная часть mysql
Открыть django/db/backends/mysql/introspection.py
и найдите функцию get_table_list
:
def get_table_list(self, cursor):
cursor.execute("SHOW FULL TABLES")
return [TableInfo(row[0], {'BASE TABLE': 't', 'VIEW': 'v'}.get(row[1]))
for row in cursor.fetchall()]
Замените его чем-то вроде
def get_table_list(self, cursor):
names = [TableInfo('mytable1', 't')]
return names
Чтобы решить, следует ли использовать второй аргумент для TableInfo
является t
или v
, запустите запрос mysql SHOW FULL TABLES
и выясните свой table_type
если это BASE_TABLE
тогда второй аргумент таков t
ещё v
Тогда беги
python manage.py inspectdb > models.py
Начиная с Django 1.10, команда inspectdb принимает необязательный список таблиц в командной строке, который ограничивает, какие таблицы будут проверяться.