Skip to content

makecodes/django-dbml

django-dbml

django-dbml is a Django app that generates a DBML schema from your Django models.

It is useful when you want to:

  • visualize your schema in tools that understand DBML
  • document an existing Django project
  • export a model-based schema for reviews, planning, or onboarding

The generated output includes:

  • tables
  • foreign key and one-to-one relationships
  • autogenerated many-to-many join tables
  • indexes and unique constraints
  • enums derived from Django field choices
  • notes derived from model and field metadata

Requirements

  • Python >=3.11
  • Django >=4.2,<6.0

Installation

Install the package:

pip install django-dbml

Add django_dbml to INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    "django_dbml",
]

Quick Start

Generate DBML for all installed models:

python manage.py dbml

Write the schema to a file:

python manage.py dbml --output_file schema.dbml

Generate DBML for a single app:

python manage.py dbml billing

Generate DBML for a single model:

python manage.py dbml billing.Invoice

When you target a specific app or model, django-dbml also includes the forward-related tables needed to keep the schema usable.

Command Reference

The management command is:

python manage.py dbml [app_label[.ModelName] ...] [options]

Supported options:

  • --output_file PATH Write the generated DBML to a file instead of stdout.
  • --table_names Use the underlying database table names instead of Django model labels such as app_label.ModelName.
  • --group_by_app Add TableGroup blocks grouped by app/module.
  • --color_by_app Add headercolor to each table based on its app/module.
  • --add_project_name NAME Set the DBML project name.
  • --add_project_notes TEXT Set the DBML project notes.
  • --disable_update_timestamp Do not append the Last Updated At ... UTC line to the project notes.

Examples

Generate the whole project

python manage.py dbml --add_project_name "Backoffice"

Generate a subset of apps

python manage.py dbml accounts billing crm

Generate a subset of models

python manage.py dbml billing.Invoice billing.InvoiceLine

Save output to a file

python manage.py dbml --output_file docs/schema.dbml

Use physical table names instead of model labels

python manage.py dbml --table_names

Add project metadata

python manage.py dbml \
  --add_project_name "Commerce Platform" \
  --add_project_notes "Generated from production models." \
  --output_file schema.dbml

Group and color tables by app

python manage.py dbml --group_by_app --color_by_app

How Metadata Is Mapped

django-dbml extracts useful schema notes from Django metadata when available.

Model-level metadata:

  • model docstrings are emitted as table notes
  • db_table_comment is emitted as a table note
  • when --table_names is not used, the DB table name is added to the note

Field-level metadata:

  • help_text is emitted as a field note
  • verbose_name is emitted as a field note
  • db_comment is emitted as a field note
  • choices are converted into DBML enums
  • default, null, unique, and primary key information are included in field attributes

Relationship handling:

  • ForeignKey is rendered as a one-to-many reference
  • OneToOneField is rendered as a one-to-one reference
  • autogenerated ManyToManyField join tables are rendered as explicit DBML tables and references

Example Output

Example command:

python manage.py dbml library --add_project_name "Library"

Example shape of the generated DBML:

Project "Library" {
  database_type: 'PostgreSQL'
  Note: '''Generated from Django models.
  Last Updated At 03-30-2026 02:15PM UTC'''
}

Table library.Book {
  title char [not null]
  author_id bigint [not null]
}

ref: library.Book.author_id > library.Author.id

The exact output depends on your models, database backend, indexes, choices, and comments.

Development

This repository is managed with uv.

Bootstrap the environment:

make sync

Common commands:

make test
make lint
make build

Run the test suite against a specific Django series:

make test-django DJANGO_CONSTRAINT="django>=5.1,<5.2" PYTHON=3.13

More development details are available in CONTRIBUTING.md and docs/development.md.

Contributors

Thanks to the people who helped improve this project through patches and pull requests, including:

  • Michel Wilhelm
  • Ee Durbin
  • Mathieu Hinderyckx
  • Rebecca Sutton Koeser
  • Evgeny
  • Nick Budak
  • jcp
  • johnecon

Credits

The initial code was based on https://github.com/hamedsj/DbmlForDjango

About

This app can generate a DBML output for all installed models.

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors