我知道这存在
django-admin.py inspectdb > models.py
但是,有没有简单的方法来限制它?无需手动删除我不想要的内容。
我正在连接一个有一百多个表的数据库,但我只想要大约 4 或 5 个模型。有没有一种简单的方法可以从几个给定的表生成模型?
它们是相当大的桌子,所以我也不喜欢把它们都打出来。
我知道这存在
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
or v
,运行 mysql 查询SHOW FULL TABLES
并找出你的table_type
如果它是BASE_TABLE
第二个参数是t
elsev
然后运行
python manage.py inspectdb > models.py
从 Django 1.10 开始,inspectdb 命令在命令行上采用一个可选的表列表,用于限制要检查的表。