Django で Model の グラフ図を出力
本エントリーは、過去エントリー : Django の ER図 出力 が 2ステップで出来た - AWS / PHP / Python ちょいメモ の修正などを含めて記載しております。
Django では、Modelの定義を行う事でデータベースは定義は自動的に作成されます。
django-extensions を使うことで、Modelからグラフ図を出力することができます (ER図とは少々違い、Modelの継承などが表現されてるので、UMLのクラス図に近いようです。でもリレーションの表現が甘い?このあたり詳しくない。。。)。内部的には、「Django の Model定義 -> dot ファイル -> Graphviz で図にする」という手順を踏んでいるので、 dot ファイルの方が扱いやすい方は、画像出力じゃない方法もとれるようです。
見つけてしまえば、たった2ステップ。簡単ですね(開発者に感謝!)
手順
先述の環境が動作してる前提で、次のコマンドをたたき、pygraphvizなどのインストール環境を作る。
$ sudo apt-get install libgraphviz-dev graphviz pkg-config
その後、pip でメインのパッケージをインストール。
$ sudo pip3 install pygraphviz $ sudo pip3 install pydotplus $ sudo pip3 install django-extensions
上記により、次がインストールされました。
- pygraphviz-1.3.1
- pydotplus-2.0.2
- django-extensions-2.0.7
導入したいDjangoプロジェクトの settings.py に Appを追加する。名前がアンダースコアなのに注意。
INSTALLED_APPS = (
...
'django_extensions',
)
Graph Model を使う
グラフ図を出力。 -a : all-applications , -g : group-models といったオプションです。
$ python manage.py graph_models -a -g -o graph-model.png
dot のみが必要な場合には -o なしで実行すればOK。
$ python3 manage.py graph_models auth
さらに特定のModelだけ含める場合
$ python3 manage.py graph_models auth -I User,Group
Django の auth App のグラフ図を出力した例です。
$ python manage.py graph_models auth -g -o graph-model-auth.png
Proxy Model として作った Personal もきちんと表現されてる
出力オプション
ちなみに出力ファイル名のところを変えると 画像:png, jpg の他、ベクター:svg , PDF:pdf , HTML:plain も出力できました。その他、こんな拡張子のファイルがだせるようです。
Graphviz - Graph Visualization Software でサポートするものなら、なんでもいけるのかな?便利ですね。
Use one of: canon cmap cmapx cmapx_np dot eps fig gd gd2 gif gv imap imap_np ismap jpe jpeg jpg pdf pic plain plain-ext png pov ps ps2 svg svgz tk vml vmlz vrml wbmp x11 xdot xdot1.2 xdot1.4 xlib
ヘルプは、manage.py help で参照できます。
$ python3 manage.py help graph_models usage: manage.py graph_models [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] [--pydot] [--group-models] [--language LANGUAGE] [--disable-fields] [--verbose-names] [--exclude-models EXCLUDE_MODELS] [--disable-sort-fields] [--include-models INCLUDE_MODELS] [--no-inheritance] [--json] [--all-applications] [--output OUTPUTFILE] [--inheritance] [--hide-relations-from-fields] [--exclude-columns EXCLUDE_COLUMNS] [--pygraphviz] [--layout LAYOUT] [app_label [app_label ...]] Creates a GraphViz dot file for the specified app names. You can pass multiple app names and they will all be combined into a single model. Output is usually directed to a dot file. positional arguments: app_label optional arguments: -h, --help show this help message and exit --version show program's version number and exit...