Django Model Map
Stop guessing your query optimizations.
django-model-map is a simple management command that inspects your Django models and outputs a JSON map of relationships. It explicitly categorizes relations into select_related and prefetch_related candidates, helping you avoid N+1 problems and write optimized QuerySets faster.
Features
- Automatic Classification: Distinguishes between
select_related(ForeignKey, OneToOne) andprefetch_related(ManyToMany, Reverse FK). - Deep Inspection: Supports configurable nesting levels for mapping nested relationships (e.g.,
prefetch_related('lvl1__lvl2__lvl3')). - Reverse Relation Discovery: Finds standard
_setaccessors and customrelated_nameattributes. - Recursion Detection: Identifies self-referencing models.
- GenericForeignKey: Detects GFK fields and marks them in the output.
- JSON / YAML Output: Easy to read, parse, or integrate into other tools.
Installation
pip install django-model-map
# With YAML output support (optional)
pip install django-model-map[yaml]
Add to INSTALLED_APPS:
INSTALLED_APPS = [
...
'django_model_map',
...
]
Usage
CLI
# Inspect all installed apps
python manage.py modelmap
# Inspect a specific app
python manage.py modelmap [app_name]
# Named alternative to positional
python manage.py modelmap --app [app_name]
# Specify inspection nesting level (default: 1)
python manage.py modelmap [app_name] --depth 2
# Exclude models or entire apps (repeatable)
python manage.py modelmap --exclude auth.Permission --exclude auth.Group
# Save to file
python manage.py modelmap [app_name] --output relations.json
# YAML output (requires pip install django-model-map[yaml])
python manage.py modelmap [app_name] --format yaml
Python API
from django_model_map import get_model_map
# Inspect a specific app, depth 2, exclude some models
model_map = get_model_map(app_label='myapp', depth=2, exclude=['myapp.OldModel'])
for model_name, data in model_map.items():
print(data['queryset_snippet'])
Example Output
{
"blog.Post": {
"queryset_snippet": "Post.objects.select_related('author', 'category').prefetch_related('tags', 'comments')",
"select_related_fields": [
"author",
"category"
],
"prefetch_related_fields": [
"tags",
"comments"
],
"details": {
"select_related": [
{
"field_name": "author",
"target_model": "users.User",
"is_recursive": false
},
...
],
"prefetch_related": [
{
"field_name": "tags",
"target_model": "blog.Tag",
"is_recursive": false
},
{
"field_name": "content_object",
"target_model": "Generic",
"is_recursive": false,
"type": "generic"
},
...
]
}
}
}
How it helps
When writing a view, instead of opening models.py and mentally parsing the relationships, just look at the output. With the --depth argument, you can automatically discover deeply nested relationships that need optimization:
- Copy fields from
"queryset_snippet"-> paste into project. - Copy fields from
"select_related_fields"-> paste into.select_related(...). - Copy fields from
"prefetch_related_fields"-> paste into.prefetch_related(...).
Contributing
Pull requests are welcome! For major changes, please open an issue first.
License
Metadata
Release files for django-model-map 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_model_map-0.4.0.tar.gz | 8.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_model_map-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.1 kB
Release files / django_model_map-0.4.0.tar.gz
| Download URL | django_model_map-0.4.0.tar.gz |
|---|---|
| Size | 8.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
01482a1f9bf6292e5cbac0f58fa8e2daa9d911534afb1009ae02d2187e2d4963
|
|
BLAKE2b-256 checksum How to use checksums |
fcd76aa342325120b7db9bd96d69190b6655e20bb9c63f3d4eb50f959ccee862
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 6, 2026.
Transparency logRelease files / django_model_map-0.4.0-py3-none-any.whl
| Download URL | django_model_map-0.4.0-py3-none-any.whl |
|---|---|
| Size | 9.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b8d273e55e8d012740f5fab8227e05455fefd0cb447b000ae7fd89c5726bfdef
|
|
BLAKE2b-256 checksum How to use checksums |
d45a1807a57dd39c875fcaa2fcc546a5cfb6182e01b7a81387e24e49eba36fb5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 6, 2026.
Transparency log