As requirements are gradually confirmed, the system’s DB model is gradually confirmed as well. Sometimes you use a tool like MySQL Workbench to draw an E-R diagram and then generate MySQL database tables, and at that point you need to reverse-generate Django Models; other times you write the Django Models directly, but then you need to look at the E-R diagram. This article mainly addresses the two needs above, implementing conversion between Django Models and E-R diagrams.
1. Generating the Model Relationship Diagram
Django provides the third-party package django-extensions, which can be used to generate an E-R diagram from the Models in Django.
1.1 Installing the Package
| |
1.2 Configuration
In the Django settings.py file, add django_extensions to INSTALLED_APPS.
| |
1.3 Generating the dot File and the png Image
- Generate the E-R diagram for all models
| |
- Generate the dot file for a single Django App (using
django_view_permissionas an example).
| |
The exported dot content is as follows: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];
}
- Generate the image
Since what is generated is a dot-format image description file, you need a tool to convert it into the commonly used PNG format. You can download graphviz and add /bin/dot.exe to the system PATH.
| |
You can also use the online Dot preview tool GraphvizOnline to view it and download the PNG image.

2. Generating the Database’s models.py
Django has a built-in inspectdb command, which can use the database’s corresponding table relationships and fields to generate Django Models.
| |
The exported file content is as follows:export_models.py
| |
Note that when using the migrate command to create database tables, Models with managed = False will be ignored.
