{"id":14972698,"url":"https://github.com/paduszyk/django-management-commands","last_synced_at":"2026-02-27T18:48:14.792Z","repository":{"id":257778836,"uuid":"859518172","full_name":"paduszyk/django-management-commands","owner":"paduszyk","description":"Modular discovery, aliasing, and sequencing of Django management commands.","archived":false,"fork":false,"pushed_at":"2025-07-21T20:32:30.000Z","size":57,"stargazers_count":4,"open_issues_count":12,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-21T22:27:05.671Z","etag":null,"topics":["django","django-application","django-commands","django-management-commands","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paduszyk.png","metadata":{"files":{"readme":"docs/README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-18T19:52:59.000Z","updated_at":"2025-01-21T11:39:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"8487c5b3-0ffe-496d-a851-b7ab3d70e46a","html_url":"https://github.com/paduszyk/django-management-commands","commit_stats":{"total_commits":34,"total_committers":3,"mean_commits":"11.333333333333334","dds":"0.11764705882352944","last_synced_commit":"e6806b5545307c918861fde5bd9a26d36b682a0a"},"previous_names":["paduszyk/django-management-commands"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/paduszyk/django-management-commands","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paduszyk%2Fdjango-management-commands","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paduszyk%2Fdjango-management-commands/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paduszyk%2Fdjango-management-commands/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paduszyk%2Fdjango-management-commands/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paduszyk","download_url":"https://codeload.github.com/paduszyk/django-management-commands/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paduszyk%2Fdjango-management-commands/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267512945,"owners_count":24099628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","django-application","django-commands","django-management-commands","python"],"created_at":"2024-09-24T13:47:23.408Z","updated_at":"2026-02-27T18:48:09.741Z","avatar_url":"https://github.com/paduszyk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# django-management-commands\n\n[![PyPI: Version](https://img.shields.io/pypi/v/django-management-commands?logo=pypi\u0026logoColor=white)][pypi]\n[![PyPI: Python](https://img.shields.io/pypi/pyversions/django-management-commands?logo=python\u0026logoColor=white)][pypi]\n[![PyPI: Django](https://img.shields.io/pypi/djversions/django-management-commands?logo=django\u0026label=django\u0026color=0c4b33)][pypi]\n[![PyPI: License](https://img.shields.io/pypi/l/django-management-commands)][pypi]\n\n[![Pre-commit.ci](https://results.pre-commit.ci/badge/github/paduszyk/django-management-commands/main.svg)][pre-commit.ci]\n[![CI](https://img.shields.io/github/actions/workflow/status/paduszyk/django-management-commands/package-ci.yml?logo=github\u0026label=CI)][ci]\n[![Codecov](https://img.shields.io/codecov/c/github/paduszyk/django-management-commands?logo=codecov)][codecov]\n\n[![Nox](https://img.shields.io/badge/%f0%9f%a6%8a-Nox-d85e00)][nox]\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)][ruff]\n[![Mypy](https://img.shields.io/badge/type--checked-mypy-blue?logo=python)][mypy]\n[![Prettier](https://img.shields.io/badge/code_style-Prettier-1e2b33?logo=prettier)][prettier]\n[![Conventional Commits](https://img.shields.io/badge/Conventional_Commits-1.0.0-fa6673?logo=conventional-commits)][conventional-commits]\n\n## Overview\n\n`django-management-commands` is a plugin that provides enhanced flexibility for\ndefining, organizing, and executing Django commands.\n\nWhile Django enforces certain conventions for [management commands][django-commands],\nthis package allows you to bypass these limitations. With `django-management-commands`,\nyou can define and manage commands outside the traditional `management.commands`\npackage, giving you greater freedom in structuring your project. This is especially\nuseful for developers working on large projects with multiple apps or complex command\nstructures, where organizing commands effectively is critical.\n\n## Key Features\n\n- **Flexible Command Location**: Define commands in any module, allowing you to\n  organize your codebase more freely without relying on Django's default structure.\n\n- **Custom Command Naming**: Assign names to commands independently of their submodules,\n  enabling clearer and more intuitive command management.\n\n- **Command Name Conflicts Resolution**: Resolve command name conflicts by referencing\n  commands through app labels.\n\n- **Enhanced Command Management**: Define, organize, and execute commands or aliases\n  via your Django settings, simplifying complex command sequences and improving\n  maintainability.\n\n## Requirements\n\nThis package supports the following Python and Django versions:\n\n| Python | Django        |\n| :----- | :------------ |\n| 3.9    | 4.2           |\n| 3.10   | 4.2, 5.0, 5.1 |\n| 3.11   | 4.2, 5.0, 5.1 |\n| 3.12   | 4.2, 5.0, 5.1 |\n\nConfiguration is managed through [`django-appconf ~= 1.0`][django-appconf].\n\n## Installation\n\nTo install the plugin, download and install it from [PyPI][pypi] using `pip`:\n\n```console\npip install django-management-commands\n```\n\nYou can also use any other dependency manager of your choice. Once installed, you\ncan access the plugin's features through the `management_commands` package.\n\n\u003e We recommend avoiding global or system-wide Python environments for package installation.\n\u003e Always use a virtual environment to manage your dependencies.\n\n## Django Setup\n\nTo enable advanced command management features, update your project's starter script;\nthis file is likely named `manage.py`. Replace the line that refers to Django's\nmanagement utility:\n\n```python\nfrom django.core.management import execute_from_command_line\n```\n\nwith:\n\n```python\nfrom management_commands.management import execute_from_command_line\n```\n\nThat's it! No further steps are needed.\n\n## Usage\n\n### Running Commands\n\nThe plugin does not change how commands are executed, but rather how they are discovered.\nRunning commands works the same way as with Django's built-in utility.\n\nAdditionally, you can invoke commands registered from `INSTALLED_APPS` using a more\nexplicit notation that accounts for the app label:\n\n```console\npython manage.py \u003cAPP_LABEL\u003e.\u003cCOMMAND\u003e\n```\n\nThis is particularly useful when multiple apps register commands with the same name.\nIf no app label is provided, the plugin attempts to auto-discover the command's\nmodule and class in custom paths, modules, submodules, and aliases, as described\nin the [Configuration](#configuration) section.\n\n### Configuration\n\nThe plugin provides several optional settings to customize the discovery and execution\nof Django commands via `DJANGO_SETTINGS_MODULE`.\n\n#### `MANAGEMENT_COMMANDS_PATHS`\n\n**Type:** `dict[str, str]`\n\n**Default:** `{}`\n\nThis setting maps custom command names to their corresponding class paths, allowing\nyou to define commands outside the standard app structure.\n\nExample:\n\n```python\nMANAGEMENT_COMMANDS_PATHS = {\n    \"my-command\": \"mysite.commands.MyCommand\",\n}\n```\n\nYou can now run the custom command `my-command` implemented in the `MyCommand` class\nfrom the `mysite.commands` module:\n\n```console\npython manage.py my-command\n```\n\n\u003e In Django, the class representing a command must be named `Command`. The plugin\n\u003e allows you to name it with any valid Python identifier, enabling multiple commands\n\u003e within a single module.\n\n**Important Notes:**\n\n- All keys and values must be valid Python identifiers (with hyphens allowed) and\n  absolute dotted paths, respectively.\n- Paths must point to command classes, not modules.\n- Commands must subclass `django.core.management.base.BaseCommand`.\n- This setting takes precedence over others when discovering commands.\n\n#### `MANAGEMENT_COMMANDS_MODULES`\n\n**Type:** `list[str]`\n\n**Default:** `[]`\n\nSpecifies the modules where custom commands should be discovered.\n\nExample:\n\n```python\nMANAGEMENT_COMMANDS_MODULES = [\n    \"mycommands\",\n]\n```\n\nWhen running:\n\n```console\npython manage.py mycommand\n```\n\nthe utility will search for the `Command` class in the `mycommands.mycommand` module.\n\n**Important Notes:**\n\n- Items must be valid absolute dotted Python paths.\n- Commands are discovered in modules in the order they are listed.\n\n#### `MANAGEMENT_COMMANDS_SUBMODULES`\n\n**Type:** `list[str]`\n\n**Default:** `[]`\n\nDefines submodules within app packages where commands should be discovered. Django's\ndefault `management.commands` is automatically inserted at index 0 if not explicitly\nincluded.\n\nExample:\n\n```python\nMANAGEMENT_COMMANDS_SUBMODULES = [\n    \"commands\",\n]\n```\n\nThis allows the utility to search for `Command` classes in both `myapp.management.commands.command`\nand `myapp.commands.command` for an app installed from the `myapp` module.\n\n**Important Notes:**\n\n- Items must be valid absolute dotted Python paths (although at runtime, they are\n  treated as relative paths appended to app names).\n\n#### `MANAGEMENT_COMMANDS_ALIASES`\n\n**Type:** `dict[str, list[str]]`\n\n**Default:** `{}`\n\nAllows the definition of shortcuts or aliases for sequences of Django commands.\n\nExample:\n\n```python\nMANAGEMENT_COMMANDS_ALIASES = {\n    \"full-check\": [\n        \"check --fail-level ERROR --deploy\",\n        \"makemigrations --check --dry-run --no-input\",\n        \"migrate --no-input\",\n    ],\n}\n```\n\nYou can now execute all the commands aliased by `full-check` with a single command:\n\n```console\npython manage.py full-check\n```\n\nAliases can refer to commands defined in the `MANAGEMENT_COMMANDS_PATHS` setting\nor other aliases.\n\n**Important Notes:**\n\n- Keys must be valid Python identifiers (with hyphens allowed).\n- Values should be command expressions with parsable arguments and options.\n- Circular references within aliases are not allowed, as they lead to infinite recursion.\n\n### Error Handling\n\n#### Configuration Checks\n\nThe plugin performs basic validation of user settings, primarily checking command\nnames, aliases, and module paths. If any checks fail, the plugin raises an `ImproperlyConfigured`\nerror.\n\nFor more information, see the `management_commands.conf` module.\n\n\u003e The `ImproperlyConfigured` error here is distinct from the one in `django.core.exceptions`;\n\u003e the plugin's uses its own exception class defined with its configuration.\n\n#### Custom Exceptions\n\nThe package includes custom exceptions for error handling:\n\n- **`CommandImportError`**: raised if the command class import fails;\n\n- **`CommandTypeError`**: raised if the imported command class is not a subclass\n  of Django's `BaseCommand`;\n\n- **`CommandClassLookupError`**: raised if a command cannot be discovered;\n\n- **`CommandAppLookupError`**: raised when a command is referenced by app label,\n  but the app with that label is not installed.\n\nFor more information, see the `management_commands.exceptions` module.\n\n\u003e Be sure to review these exceptions when debugging or reporting issues.\n\n## Contributing\n\n- This is an open-source project and welcomes all types of contributions.\n- Contributors must adhere to our [Code of Conduct][code-of-conduct].\n- For detailed contribution guidelines, please refer to our [Contributing Guide][contributing].\n\n## License\n\nReleased under the [MIT license][license].\n\n[ci]: https://github.com/paduszyk/django-management-commands/actions/workflows/package-ci.yml\n[code-of-conduct]: https://github.com/paduszyk/django-management-commands/blob/main/docs/CODE_OF_CONDUCT.md\n[codecov]: https://app.codecov.io/gh/paduszyk/django-management-commands\n[contributing]: https://github.com/paduszyk/django-management-commands/blob/main/docs/CONTRIBUTING.md\n[conventional-commits]: https://www.conventionalcommits.org/\n[django-appconf]: https://github.com/django-compressor/django-appconf\n[django-commands]: https://docs.djangoproject.com/en/dev/howto/custom-management-commands/\n[license]: https://github.com/paduszyk/django-management-commands/blob/main/LICENSE\n[mypy]: https://mypy.readthedocs.io\n[nox]: https://nox.thea.codes/\n[pre-commit.ci]: https://results.pre-commit.ci/latest/github/paduszyk/django-management-commands/main\n[prettier]: https://prettier.io\n[pypi]: https://pypi.org/project/django-management-commands/\n[ruff]: https://docs.astral.sh/ruff/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaduszyk%2Fdjango-management-commands","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaduszyk%2Fdjango-management-commands","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaduszyk%2Fdjango-management-commands/lists"}