在需求逐步确认的过程中,系统的 DB 模型也逐步确认。有时使用,MySQL Workbench 这类工具绘制 E-R 图,然后生成 MySQL 数据库表,这时就需要反向生成 Django Models;有时直接写 Django Models ,但是又需要查看 E-R 图。本文主要解决上面两个需求,实现 Django Models 与 E-R 图之间的转换。
1. 生成 model 的关系图
Django 提供第三方包 django-extensions
,可以用来将 Django 中的 Models 生成 E-R 图。
1.1 安装包
|
|
1.2 配置
在 Django settings.py 文件, INSTALLED_APPS
中添加 django_extensions
。
|
|
1.3 生成 dot 文件和 png 图片
- 生成全部 model 的 E-R 图
|
|
- 单独某个 Django App (以
django_view_permission
为例) 生成 dot 文件。
|
|
导出的 dot 内容如下:django_view_permission.dot
digraph model_graph {
// Dotfile by Django-Extensions graph_models
// Created: 2018-03-03 14:55
// Cli Options: django_view_permission
fontname = "Helvetica"
fontsize = 8
splines = true
node [
fontname = "Helvetica"
fontsize = 8
shape = "plaintext"
]
edge [
fontname = "Helvetica"
fontsize = 8
]
// Labels
django_view_permission_models_CommonElement [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
CommonElement
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">create_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">doc</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">update_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
django_view_permission_models_View [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
View<BR/><<FONT FACE="Helvetica Italic">CommonElement</FONT>>
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">create_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">doc</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">func</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">module</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">update_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
django_view_permission_models_ViewSet [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
ViewSet<BR/><<FONT FACE="Helvetica Italic">CommonElement</FONT>>
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">create_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">doc</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">name</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">update_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
django_view_permission_models_ViewPermission [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
ViewPermission<BR/><<FONT FACE="Helvetica Italic">CommonElement</FONT>>
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">create_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">doc</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">update_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
// Relations
django_view_permission_models_View -> django_view_permission_models_CommonElement
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
django_view_permission_models_ViewSet -> django_view_permission_models_View
[label="views (viewset)"] [arrowhead=dot arrowtail=dot, dir=both];
django_view_permission_models_ViewSet -> django_view_permission_models_CommonElement
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
account_models_BkUser [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">BkUser</FONT>
</TD></TR>
</TABLE>
>]
django_view_permission_models_ViewPermission -> account_models_BkUser
[label="users (viewpermission)"] [arrowhead=dot arrowtail=dot, dir=both];
django_view_permission_models_ViewPermission -> django_view_permission_models_View
[label="views (viewpermission)"] [arrowhead=dot arrowtail=dot, dir=both];
django_view_permission_models_ViewPermission -> django_view_permission_models_ViewSet
[label="views_set (viewpermission)"] [arrowhead=dot arrowtail=dot, dir=both];
django_view_permission_models_ViewPermission -> django_view_permission_models_CommonElement
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
}
- 生成图片
由于生成的是 dot 格式的图片描述文件,需要使用工具进行转换成常用的 PNG 格式图片。可以下载 graphviz ,并将 /bin/dot.exe 加入系统 PATH 中。
|
|
还可以使用在线 Dot 预览工具 GraphvizOnline 查看,下载 PNG 图片。
2. 生成数据库的 models.py
Django 内置了 inspectdb 命令,可以利用数据库对应的表关系和字段,生成 Django Models。
|
|
导出的文件内容如下:export_models.py
|
|
需要注意的是,使用 migrate 命令创建数据库表时,managed = False
的 Models 会被忽略。