一款Python语言Django框架DDD脚手架,适合快速搭建项目 这是什么Django-DDD 是一个精心打造的 Python 语言 DDD 工程脚手架帮你快速搭建符合 DDD 精髓的 Web 服务。项目内置用户与订单示例、领域事件与内存总线、多数据库路由、统一响应与全局异常处理适合作为团队工程模板给AI提供代码规范参考。为什么要用DDD很多人认为 Python 没必要用 DDD毕竟它和 Ruby、JS 一样轻巧灵活Django 自带的 MTVModel-Template-View拿来就能写。确实大多数场景下数据驱动的 Django 模式完全够用。工程化无非是把接口处理、业务逻辑、数据处理区分开让各部分各司其职方便维护和扩展。DDD 相对更适合中大型项目如果项目有几十个模块、上百个接口用 DDD 设计会更合适模块少、接口不多的话简单分层就够了。项目做大以后会遇到三个常见问题业务规则散落在各处View 里判断状态Model 里写校验Service如果有里再来一次Model 太胖既承担持久化又承担业务逻辑测试必须起 Django 才能跑强耦合 Django业务代码离不开django.db.models替换存储引擎几乎是重构本脚手架遵循务实 DDD抓住精髓分层 领域模型 仓储抽象 领域事件不死守概念不做 CQRS、不强制事件溯源、不要求每个业务都建聚合。总之是否采用 DDD 和语言无关只跟业务规模有关。源码地址design-patterns/practice-projects/django-ddd at main · microwind/design-patterns · GitHub核心特点严格 DDD 四层架构领域层、应用层、基础设施层、接口层Django 5 DRF成熟生态 灵活 APIView事件驱动领域事件 进程内 Publisher可替换为 Kafka/RocketMQ双数据库支持用户库 订单库独立配置默认 MySQL PostgreSQL统一响应格式{ code, message, data } 全局异常处理器领域层零 Django 依赖纯 Python dataclass方便单元测试自动 OpenAPIdrf-spectacular 生成 Swagger UI零警告零错误Docker 一键起停MySQL PostgreSQL 应用整套编排技术栈技术版本说明Python3.10语言版本使用str | None等新语法Django5.1Web 框架DRF3.15REST 接口层drf-spectacular0.27OpenAPI/Swagger 生成MySQL8.0用户库默认PostgreSQL13订单库默认YAML-配置文件格式工程结构DDD 四层架构DDD 四层架构依赖接口实现接口接口层 InterfacesDRF APIView · URLConf · Serializer应用层 Application用例编排 · 事务边界 · Command/DTO领域层 Domain聚合根 · 业务规则 · 领域事件基础设施层 InfrastructureDjango ORM · 事件发布器 · 数据库重点外层只依赖内层基础设施通过实现领域层定义的接口Repository、EventPublisher完成对内供给保证领域层零框架依赖。工程结构图基础设施层 Infrastructure领域层 Domain应用层 Application接口层 Interfaces发布事件实现产生DRF APIViewSerializer 请求校验URLConf 路由应用服务Command / DTO聚合根 User · OrderRepository 接口领域事件Django ORM ModelRepository 实现EventPublisher 实现MySQLfrogPostgreSQLseed工程结构列表django-ddd/├── config/│ ├── config.yaml # 本地配置与 gin-ddd 字段一致│ └── config.docker.yaml # docker compose 专用├── docs/│ ├── init.mysql.sql # 用户库 DDL 样例数据│ └── init.postgres.sql # 订单库 DDL 样例数据├── src/│ ├── project/ # Django project│ │ ├── settings.py # 读 YAML → DATABASES 等│ │ ├── urls.py # 根路由健康检查 /api 文档│ │ ├── routers.py # app_label → database 路由器│ │ ├── wsgi.py / asgi.py│ │ └── __init__.py│ ├── shared/ # 共享层│ │ ├── apps.py # 启动时构建事件发布器│ │ ├── domain/│ │ │ ├── events.py # DomainEvent 基类│ │ │ └── publisher.py # EventPublisher 抽象│ │ └── infrastructure/│ │ ├── config.py # YAML → dataclass│ │ ├── response.py # 统一响应 ApiResponseSerializer│ │ ├── exceptions.py # 领域异常 全局 handler│ │ └── events.py # InMemoryEventPublisher│ ├── user/ # 用户 bounded context│ │ ├── domain/{user,repository,events}.py # 聚合根/接口/事件│ │ ├── application/{dto,service}.py # Command 应用服务│ │ ├── infrastructure/{models,repository,listeners}.py # ORM 仓储实现 订阅者│ │ ├── interfaces/{serializers,views,urls}.py # DRF 视图 路由│ │ ├── models.py # re-export 供 Django 发现│ │ └── apps.py # AppConfig.ready() 注册监听器│ └── order/ # 订单 bounded context含状态机│ └── ... 同 user 结构├── Dockerfile├── compose.yaml├── manage.py├── pyproject.toml└── requirements.txt各层职责说明层级位置职责关键原则领域层*/domain/聚合根、值对象、领域事件、仓储接口绝不 import django业务规则内聚应用层*/application/用例编排Command/DTO事务边界薄而清晰不实现业务规则基础设施层*/infrastructure/ORM 模型、仓储实现、事件发布器实现领域接口技术细节下沉接口层*/interfaces/DRF Serializer、APIView、URL只处理 HTTP 交互不含业务规则请求生命周期以创建订单为例展示一条 HTTP 请求在四层之间的流转POST /api/orders 完整链路客户端发送 JSON接口层CreateOrderRequest 校验OrderListView.post转换为 Command应用层OrderApplicationService.create应用层检查用户是否存在领域层Order.create() 校验 业务规则基础设施层DjangoOrderRepository.savePostgreSQLINSERT orders基础设施层InMemoryEventPublisher.publishOrderCreatedEvent触发监听器接口层api_response 包装{code, message, data}关键点跨越层次由内层接口控制应用层调用OrderRepository、EventPublisher接口具体实现由基础设施在运行时注入。业务规则集中在聚合根Order.create()内部完成金额合法性、订单号生成等校验应用层不再写 if/else。事件与主流程解耦publish失败只写日志不阻塞请求响应。快速开始1. 环境准备Python 3.10项目使用了str | None等 PEP 604 语法MySQL 8.0 与 PostgreSQL 13或自行选择其一Docker可选用于一键起停2. 初始化数据库默认配置使用双数据库用户库MySQLfrog订单库PostgreSQLseedDjango 的 ORM Meta 配置为managed False不会自动改表结构表结构完全由docs/init.*.sql负责行为和 gin-ddd / nestjs-ddd 对齐。MySQL 用户库直接使用docs/init.mysql.sqlCREATE DATABASE IF NOT EXISTS frog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE frog;CREATE TABLE users (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,phone VARCHAR(20),address VARCHAR(255),created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);PostgreSQL 订单库与当前订单仓储字段一致CREATE DATABASE seed;\c seed;CREATE TABLE orders (id BIGSERIAL PRIMARY KEY,order_no VARCHAR(50) NOT NULL UNIQUE,user_id BIGINT NOT NULL,total_amount DECIMAL(12, 2) NOT NULL DEFAULT 0.00,status VARCHAR(20) NOT NULL DEFAULT PENDING,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);数据库适配注意若只用一个数据库在src/project/routers.py中把APP_DB_MAPPING全部指向default即可若订单库改为 MySQL字段BIGSERIAL / TIMESTAMP需替换为BIGINT AUTO_INCREMENT / TIMESTAMP3. 配置应用