ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Django Extensions graph_models 命令完全指南:从 Django 模型生成 GraphViz 架构图

Django Extensions graph_models 命令完全指南:从 Django 模型生成 GraphViz 架构图 后端开发工具【免费下载链接】django-extensionsThis is a repository for collecting global custom management extensions for the Django Framework.项目地址https://gitcode.com/gh_mirrors/dj/django-extensions点击查看免费下载导读graph_models是 django-extensions 提供的 Django 管理命令它读取指定 app或INSTALLED_APPS全部应用的models.py解析模型、字段与关系输出一份 GraphViz DOT 格式的图形化概览并可在安装 pygraphviz 或 pydot 后直接渲染为 PNG、SVG、PDF 等图片。本文以 docs/graph_models.rst 为主线结合 graph_models.py、modelviz.py 的源码实现与 test_graph_models.py 测试用例系统讲解安装选型、全局默认配置、模板定制、按 app 着色、模型包含/排除、关系样式等全部能力读完即可在实际项目中一键输出可读的模型关系图。一、命令定位与整体工作流程命令的帮助信息与文档第一句一致Creates a GraphViz dot file for the specified app names.。你可以传入多个 app 名称它们会被合并进同一个模型图中输出通常被重定向到一个 dot 文件也可以使用-o直接指定输出文件。从源码看命令执行分为几个阶段见 graph_models.py 的handle方法确定 app 列表读取位置参数app_label若为空且未开启--all-applications则回退到settings.GRAPH_MODELS[app_labels]否则抛出CommandError: need one or more arguments for appname。确定输出格式根据--pydot / --pygraphviz / --json / --dot选项、-o文件扩展名以及库可用性自动决策输出为 dot 文本、JSON 还是图片。构建模型图数据由ModelGraphmodelviz.py负责遍历 app、模型、字段与关系生成结构化图数据。模板渲染通过 Django 模板加载器加载django_extensions/graph_models/theme/digraph.dot等三份模板渲染成最终 DOT 代码modelviz.py。输出写文件、打印到 stdout或交给 pygraphviz/pydot 渲染成图片。整个流程既有文档与源码双重支撑也被测试覆盖test_graph_models_no_output_options验证了无任何输出选项时默认输出 DOT 文本test_graph_models_json_option_to_file等用例则验证了 JSON 输出见 test_graph_models.py。二、选择渲染库pygraphviz 与 pydot生成图片需要选择一个图形渲染库通过命令行参数指定--pygraphviz使用 PyGraphViz 渲染。--pydot使用 PyDot或 PyDotPlus渲染。当两者都未指定时默认按 pygraphviz → pydot 的顺序尝试加载可用库。源码中两个库都是可选的导入graph_models.pyHAS_PYGRAPHVIZ尝试import pygraphvizHAS_PYDOT先尝试import pydotplus失败则回退import pydot。安装方式安装 pygraphviz 通常一条命令即可$ pip install pygraphviz但 pygraphviz 需要编译 C 扩展某些环境下可能安装失败。此时可以改用 PyDot$ pip install pyparsing pydot注意文档特别强调要安装这个精确版本的 pyparsing否则可能出现如下错误Couldnt import dot_parser, loading of dot files will not be possible.输出格式的自动决策逻辑handle方法中的决策顺序值得细读graph_models.py若--pydot / --pygraphviz / --json / --dot中多于一个被设置直接报错Only one of ... can be set。设置了某个格式选项时以该选项为准。未设置格式选项且没有-o文件时出于向后兼容默认输出 DOT 文本到 stdout。有-o文件时按扩展名推断.dot→ DOT、.json→ JSON其他扩展名先看 pygraphviz 是否可用再看 pydot两者都没有则报错并提示改用--json或--dot输出文本。一致性检查设置--pygraphviz或--pydot但未提供-o文件时会报错要求必须指定输出文件2.1.4 之前此场景会静默退化为 stdout 输出 dot 文本。测试test_graph_models_pydot_without_file与test_graph_models_pygraphviz_without_file明确断言了这一行为。三、默认设置settings.GRAPH_MODELS如果不希望每次都在命令行敲参数可以在 Django 设置文件中通过GRAPH_MODELS {}字典指定默认选项例如GRAPH_MODELS { all_applications: True, group_models: True, }命名规则与命令行长选项同名去掉开头的两个短横线--其余-替换为_。例如--disable-fields对应键名disable_fields。实现见 graph_models.pyhandle构造时遍历self.arguments将每个长选项名转换为设置键名命中则覆盖该参数的默认值。要指定一组默认的 app使用app_labels键GRAPH_MODELS { app_labels: [myapp1, myapp2, auth], }这个键是特殊处理的当命令行未给 app 且未开--all-applications时会回退读取GRAPH_MODELS[app_labels]作为默认 app 列表graph_models.py。四、模板机制用 Django 模板生成 DOT文档明确指出DOT 代码由 Django 模板生成再由 pygraphviz/pydot 等库绘制成图片你可以按需扩展或覆盖模板。命令使用的三份模板是django_extensions/graph_models/digraph.dotdjango_extensions/graph_models/label.dotdjango_extensions/graph_models/relation.dot当前仓库在 templates/django_extensions/graph_models 下提供了三套主题主题目录特点original/默认字体 Helvetica经典样式django2018/默认主题--theme缺省值字体 RobotoHTML 表格节点django2018style/django2018 的样式变体--theme/-t参数选择主题默认django2018帮助信息说明可自行创建django_extensions/graph_models/themename/模板目录来定制新主题graph_models.py。渲染时模板上下文包含created_at、cli_options、rankdir、ordering、use_subgraph、graphs等图数据字段。以默认主题 digraph.dot 为例它通过{% block digraph_options %}设置rankdir、ordering再分别{% include %}label.dot模型节点以 HTMLTABLE呈现字段名与类型和 relation.dot关系边。模板渲染的注意事项修改 Django 默认的模板加载行为可能破坏 graph_models任何改变模板渲染方式的template_loaders或扩展都可能导致graph_models失败。典型反例是 Django 应用django-template-minifier它会自动删除模板标签前后的换行即便对非 HTML 模板也如此最终产生格式损坏的 dot 文件。此外generate_dot还会校验模板确实由默认 Django 模板加载器渲染要求是Template实例否则抛出异常提示检查设置modelviz.py。五、按 App 着色App-based Styling当多个 app 的模型相互关联时可以按 app 分别着色以直观区分模型归属。两种提供样式文件的方式在项目根目录放置.app-style.json文件默认文件名源码常量DEFAULT_APP_STYLE_NAME用--app-style命令行选项指定 JSON 文件路径$ ./manage.py graph_models -a --app-style path/to/style.json -o styled_output.pngJSON 文件将app label 映射到样式字典。app label 可以精确匹配也可以使用通配符如django.*多个匹配时最后一条生效。示例{ app1: {bg: #341b56}, app2: {bg: #1b3956}, django.*: {bg: #561b4c}, django.contrib.auth: {bg: #c41e3a} }目前支持的样式键只有bg背景色但设计上已为未来扩展font、shape、border 等预留了空间。源码级实现retheme()graph_models.py读取 JSON用object_pairs_hookOrderedDict保持顺序遍历每个 graph 的每个模型用fnmatch.fnmatchcase(app_name, pattern)做通配符匹配将命中 pattern 的样式写入模型style字典——由于按 JSON 键顺序迭代后写入的覆盖先写入的这正是最后一条生效的实现来源。样式文件的查找顺序先看--app-style指定的路径若未指定则尝试项目根目录settings.BASE_DIR下的.app-style.jsongraph_models.py。文件不存在会抛异常命令行指定且文件不存在时直接CommandError默认文件也不存在则跳过着色。样式的应用点模板中模型表头背景BGCOLOR{{ model.style.bg|default:#1b563f }}label.dot说明bg实际控制节点表头栏的背景色。这一特性让你能在单张图中同时高亮各 app 的模型分组、又不切断跨 app 的关系。六、完整命令行用法示例基础生成 dot 文件或图片# 创建 dot 文件输出到 stdout重定向到文件 $ ./manage.py graph_models -a my_project.dot # 生成 PNG 图片并启用 app 分组 $ ./manage.py graph_models -a -g -o my_project_visualized.png使用-a--all-applications会自动纳入INSTALLED_APPS中的全部应用modelviz.py即apps.get_app_configs()的每个app.label。带 app 分组的输出效果参见下图按 app 着色生成 PNG$ ./manage.py graph_models -a --app-style path/to/style.json -o my_styled_project.png效果示意指定渲染后端$ ./manage.py graph_models --pygraphviz -a -g -o my_project_visualized.png $ ./manage.py graph_models --pydot -a -g -o my_project_visualized.png只绘制指定的 app$ ./manage.py graph_models foo bar my_project.dot只包含特定模型支持通配符$ ./manage.py graph_models -a -I Foo,Bar -o my_project_subsystem.png-I/--include-models将图限制为指定模型*通配符可用。匹配逻辑见ModelGraph.use_modelmodelviz.py通配符*被替换为.*并包裹成^...$正则对模型名做匹配。只含 Foo/Bar 的效果排除特定模型$ ./manage.py graph_models -a -X Foo,Bar -o my_project_sans_foo_bar.png组合先包含后排除# 先按模式选中包含的模型再过滤掉需要排除的 $ ./manage.py graph_models -a -I Product* -X *Meta -o my_project_products_sans_meta.png隐藏关系标签$ ./manage.py graph_models -a --hide-edge-labels -o my_project_sans_foo_bar.png源码中hide_edge_labels会同时清空模型节点字段的关系标签与继承标签modelviz.py测试test_hide_edge_labels断言输出中不再出现[label...]。改变关系箭头形状$ ./manage.py graph_models -a --arrow-shape normal -o my_project_sans_foo_bar.png--arrow-shape默认值为dot合法取值box, crow, curve, icurve, diamond, dot, inv, none, normal, tee, vee。它会作为 ForeignKey / ManyToMany 边的 arrowhead/arrowtail 渲染modelviz.py。按 on_delete 给关系边着色$ ./manage.py graph_models -a --color-code-deletions -o my_project_colored.png--color-code-deletions依据关系字段的on_delete设置给边着色颜色映射定义在 modelviz.pyon_delete 值颜色CASCADEredPROTECTblueSET_NULLorangeSET_DEFAULTgreenSETyellowDO_NOTHINGgreyRESTRICTpurple仅对ForeignKey与OneToOneField生效modelviz.py。改变布局方向# 支持的方向: TB, LR, BT, RL $ ./manage.py graph_models -a --rankdir BT -o my_project_sans_foo_bar.png--rankdir默认TB自上而下可选TB/LR/BT/RL对应 GraphViz 中 top-to-bottom、left-to-right、bottom-to-top、right-to-left。注意rankdir只有在输出为pydot/pygraphviz/dot时可用选择 JSON 输出会报错graph_models.py。渲染为图片时 layout 引擎由--layout/-l指定默认dot可选circo dot fdp neato nop nop1 nop2 twopi。改变关系边排列顺序# 支持的顺序: in, out $ ./manage.py graph_models -a --ordering in -o my_project_sans_foo_bar.png--ordering控制边如何排列in先排入边/入站关系、out先排出边/出站关系默认None同样仅在pydot/pygraphviz/dot输出下可用graph_models.py。七、常用选项速查表以下参数均来自命令定义graph_models.py均可通过GRAPH_MODELS设置同名默认值选项作用--app-style按 app 着色的 JSON 样式文件路径--pygraphviz/--pydot指定图片渲染后端--dot/--json输出 DOT 文本 / JSON 数据而非图片--disable-fields -d不显示模型类成员字段--disable-abstract-fields不显示继承自抽象基类的字段--display-field-choices显示字段 choices 而非字段类型--group-models -g按 app 将模型分组subgraph 聚类--all-applications -a自动纳入 INSTALLED_APPS 全部 app--output -o渲染输出文件扩展名决定类型如 png/jpg--layout -lGraphViz 布局引擎默认dot--theme -t模板主题默认django2018--verbose-names -n使用模型与字段的 verbose_name--language -Lverbose_name 本地化语言--exclude-columns -x排除指定列也支持从文件读取列表--exclude-models -X排除指定模型支持*通配符可从文件读取--include-models -I只保留指定模型支持*通配符--inheritance -e/--no-inheritance -E是否绘制继承箭头默认包含--hide-relations-from-fields -R不将关系显示为字段--relation-fields-only只显示与关系相关的字段--disable-sort-fields -S不对字段排序--hide-edge-labels不显示关系标签--arrow-shape关系箭头形状默认dot--color-code-deletions按 on_delete 给关系边着色--rankdir布局方向默认TB--ordering边排列顺序in/out两点源码细节值得留意列表类参数支持从文件读取parse_file_or_listmodelviz.py对--exclude-columns/-x、--exclude-models/-X、--include-models/-I做解析——若参数值不是逗号分隔且指向一个存在的文件则按行读取作为列表。--relation-fields-onlyskip_field会过滤掉所有非关系字段保留 ForeignKey、ManyToMany、OneToOne、RelatedField、反向关系字段测试test_graph_models_relation_fields_only验证了它等价于手工删除全部非关系字段后的输出test_graph_models.py。八、底层模型图数据与继承处理ModelGraphmodelviz.py是图数据的核心构造器几点实现细节有助于理解输出节点与边每个模型生成一个节点含字段列表local_fields含主键、外键等与local_many_to_many生成关系边OneToOneField使用无箭头的双向边ForeignKey使用arrowheadnone、arrowtailarrow-shape的双向边ManyToManyField两侧均为arrow-shapeGenericRelation使用虚线样式modelviz.py。继承开启--inheritance默认时为每个父类添加继承边标签区分abstract/multi-table/proxy三种类型并使用arrowheadempty, dirboth的空心箭头modelviz.py。抽象模型抽象基类会被收集并展现在子类字段上get_bases_abstract_fields配合--disable-abstract-fields可隐藏这些继承字段test_disable_abstract_fields_active与test_disable_abstract_fields_not_active两个测试分别验证了开启与不开启时的字段可见性test_graph_models.py。字段排序默认按主键优先、关系字段次之、其余按 label 字母序排序modelviz.py-S可关闭。JSON 输出get_graph_data(as_jsonTrue)会剥离不可序列化的model/field对象输出created_at、cli_options、graphs等结构化数据modelviz.py便于二次程序化处理。缺失模型的关系处理generate_graph_data会为每个关系打上needs_node标记仅当目标模型确实出现在图中时才为其生成节点避免孤立节点modelviz.pytest_exclude_models_hides_relationships则回归验证了被排除模型不会残留关系边。九、写在最后graph_models是把代码中的模型关系转化为可读的架构图的轻量工具不引入额外 ORM、不修改项目代码只需一条manage.py命令即可在文档、评审、新人入职讲解中复用。日常使用建议全量架构图用-a -g -o xxx.png关注局部子系统用-I/-X结合通配符精确圈定多 app 协作项目用--app-style区分归属需要程序化分析时用--json输出结构化数据把高频参数沉淀进settings.GRAPH_MODELS让命令更简洁。对于更深度的定制如新主题、新样式键可从 templates/django_extensions/graph_models 目录出发参考 modelviz.py 中模板上下文的结构自行扩展。赞分享后端开发工具【免费下载链接】django-extensionsThis is a repository for collecting global custom management extensions for the Django Framework.项目地址https://gitcode.com/gh_mirrors/dj/django-extensions点击查看免费下载相关推荐django-extensions 的 create_template_tags 命令一键生成 Django 模板标签目录结构django extensions 的 create_template_tags 命令一键生成 Django 模板标签目录结构 导读 create_templ后端开发工具FilePizza 上线前体检P2P 文件传输从本地跑通到生产部署的完整自查指南FilePizza 上线前体检P2P 文件传输从本地跑通到生产部署的完整自查指南 FilePizza 是一个基于 Next.js 15 WebRTCPe后端开发工具Hugo 命令行文档自动生成指南深入解析 hugo gen doc 的原理与实战Hugo 命令行文档自动生成指南深入解析 hugo gen doc 的原理与实战 本文围绕 Hugo 自带的 hugo gen doc 命令展开讲解它如何把后端开发工具上一篇苹果电脑读不了NTFS硬盘免费开源工具Nigate三步搞定全盘读写下一篇1fichier 下载器实测多线程代理绕开等待把下载速度拉满创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表