AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

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 もきちんと表現されてる

f:id:hidehara:20180515183300p:plain
django-extentions の Graph models で出力

出力オプション

ちなみに出力ファイル名のところを変えると 画像: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...