Become a sponsor

本章概要
以 django_example 演示表为完整案例,演示从建表到生成到使用的全流程。
以 django_example 演示表为完整案例,演示从建表到生成到使用的全流程。该表对应项目中的 application/example/ 模块。
在数据库中执行建表语句:
CREATE TABLE `django_example` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '案例名称',
`avatar` varchar(255) DEFAULT NULL COMMENT '案例图片',
`type` int DEFAULT 1 COMMENT '案例类型:1-类型1 2-类型2 3-类型3 4-类型4',
`status` int DEFAULT 1 COMMENT '案例状态:1-正常 2-禁用',
`sort` int DEFAULT 0 COMMENT '排序',
`create_user` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_user` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`is_delete` int DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) COMMENT='案例表';python generator.py django_example --dry-run输出:
==============================================================
数据库表结构解析和代码生成工具
==============================================================
正在解析表: django_example
表结构解析成功
------------------------------------------------------------
生成配置摘要:
------------------------------------------------------------
应用名称: example
模块名称: 案例
模型类名: Example
字段数量: 5
是否有排序: True
是否有状态: True
是否有图片: True
是否有富文本: False
字段列表:
- name: 案例名称 (CharField)
- avatar: 案例图片 (CharField)
- type: 案例类型:1-类型1 2-类型2 3-类型3 4-类型4 (IntegerField)
选项: [(1, '类型1'), (2, '类型2'), (3, '类型3'), (4, '类型4')]
- status: 案例状态:1-正常 2-禁用 (IntegerField)
选项: [(1, '正常'), (2, '禁用')]
- sort: 排序 (IntegerField)
==============================================================
预览模式 - 不执行代码生成
==============================================================python generator.py django_example输出:
==============================================================
数据库表结构解析和代码生成工具
==============================================================
正在解析表: django_example
表结构解析成功
...
创建输出目录: application/example
生成文件: application/example/models.py
生成文件: application/example/forms.py
生成文件: application/example/services.py
生成文件: application/example/views.py
生成文件: application/example/urls.py
生成文件: application/example/apps.py
生成文件: application/example/admin.py
生成文件: ui/src/views/tool/example/index.vue
生成文件: ui/src/views/tool/example/edit.vue
生成文件: ui/src/views/tool/example/detail.vue
生成文件: ui/src/views/tool/example/querySchemas.ts
生成文件: ui/src/views/tool/example/columns.ts
生成文件: ui/src/api/tool/example.ts
已添加应用: application.example
已添加路由: path('example/', include('application.example.urls'))
主菜单创建成功,ID: xxx
创建权限节点: 查询案例分页
创建权限节点: 查询案例列表
...
菜单权限节点创建完成!共创建 8 个权限节点
代码生成完成!ls application/example/
# __init__.py models.py forms.py services.py views.py urls.py apps.py admin.py migrations/ls ui/src/views/tool/example/
# index.vue edit.vue detail.vue columns.ts querySchemas.ts
ls ui/src/api/tool/example.ts
# example.ts在 application/urls.py 中应新增:
# 案例模块路由
path('example/', include('application.example.urls')),在 application/settings.py 的 INSTALLED_APPS 中应新增:
'application.example', # 案例管理python manage.py runserverclass Example(BaseModel):
name = models.CharField(
null=False, max_length=100, db_index=True,
verbose_name="案例名称", db_comment='案例名称'
)
avatar = models.CharField(
null=True, blank=True, max_length=255,
verbose_name="案例图片", db_comment='案例图片'
)
TYPE_CHOICES = ((1, "类型1"), (2, "类型2"), (3, "类型3"), (4, "类型4"))
type = models.IntegerField(
null=False, choices=TYPE_CHOICES,
verbose_name="案例类型:1-类型1 2-类型2 3-类型3 4-类型4",
db_comment='案例类型:1-类型1 2-类型2 3-类型3 4-类型4'
)
STATUS_CHOICES = ((1, "正常"), (2, "禁用"))
status = models.IntegerField(
null=False, choices=STATUS_CHOICES,
verbose_name="案例状态:1-正常 2-禁用",
db_comment='案例状态:1-正常 2-禁用'
)
sort = models.IntegerField(null=False, verbose_name="排序", db_comment='排序')
class Meta:
db_table = get_table_name('example')
db_table_comment = "案例表"
ordering = ("sort",)BaseModel,自动拥有 id/create_user/create_time/update_user/update_time/is_delete 字段avatar 为图片字段TYPE_CHOICES 和 STATUS_CHOICESdb_comment 参数用于 Django 4.1+ 自动添加数据库字段注释class ExampleForm(forms.ModelForm):
name = forms.CharField(
required=True, max_length=100,
error_messages={'required': '案例名称不能为空', 'max_length': '案例名称长度不得超过100个字符'}
)
avatar = forms.CharField(required=False, max_length=255)
type = forms.IntegerField(
required=True, min_value=1, max_value=4,
error_messages={'required': '案例类型不能为空'}
)
status = forms.IntegerField(
required=True, min_value=1, max_value=2,
error_messages={'required': '案例状态不能为空'}
)
sort = forms.IntegerField(required=True)
class Meta:
model = models.Example
fields = ['name', 'avatar', 'type', 'status', 'sort']forms.ModelForm,自动绑定模型error_messages 提供友好的验证提示min_value/max_value 限制取值范围def get_example_page(request):
page_no = int(request.GET.get('pageNo', 1))
page_size = int(request.GET.get('pageSize', PAGE_SIZE))
query = Example.objects.filter(is_delete=False)
query = _apply_filters(query, request)
query = query.order_by("sort")
paginator = Paginator(query, page_size)
page_list = paginator.page(page_no)
return R.ok(data=_build_page_data(page_list, paginator, page_no, page_size))
def add_example(request):
data, error = parse_request_body(request)
form = forms.ExampleForm(data)
if not form.is_valid():
return R.failed(msg=regular.get_err(form))
Example.objects.create(...)
return R.ok(msg="创建成功")is_delete=FalsePaginator 分页parse_request_body 解析请求体@method_decorator(check_login, name="get")
class ExamplePageView(PermissionRequired, View):
permission_required = ("sys:example:page",)
@operation_log(title="案例管理-查询分页列表", log_type=LogType.QUERY)
def get(self, request):
return services.get_example_page(request)
@method_decorator(check_login, name="post")
class ExampleAddView(PermissionRequired, View):
permission_required = ("sys:example:add",)
@operation_log(title="案例管理-添加记录", log_type=LogType.ADD)
def post(self, request):
if DJANGO_DEMO:
return R.failed("演示环境,暂无操作权限")
return services.add_example(request)@method_decorator(check_login) 验证 JWT 登录PermissionRequired 检查权限节点@operation_log 记录操作日志DJANGO_DEMO 演示模式当表中包含 parent_id 或 pid 字段时,生成器自动切换为树状模板。
CREATE TABLE `django_category` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '分类名称',
`parent_id` int DEFAULT 0 COMMENT '父级ID(0为顶级)',
`sort` int DEFAULT 0 COMMENT '排序',
`status` int DEFAULT 1 COMMENT '状态:1-正常 2-禁用',
`create_user` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_user` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`is_delete` int DEFAULT 0,
PRIMARY KEY (`id`)
) COMMENT='分类表';生成器自动:
ui2/ 树形模板替代 ui/ 普通列表模板buildTree 构建树形结构代码生成后,通常需要根据业务需求进行微调:
| 自定义项 | 涉及文件 | 说明 |
|---|---|---|
| 添加业务校验 | forms.py | 添加自定义验证方法 clean_xxx |
| 添加删除前检查 | services.py | 在 delete_xxx 中检查关联数据 |
| 添加创建前处理 | services.py | 在 add_xxx 中处理特殊字段(如密码哈希) |
| 修改序列化 | services.py | 修改 _build_page_data 中的字段映射 |
| 添加自定义接口 | views.py + urls.py | 新增视图类和路由 |
| 调整前端布局 | index.vue | 修改表格列宽、操作按钮等 |
| 调整表单校验 | edit.vue | 修改表单规则、默认值等 |
通过以上 6 步即可完成一个完整业务模块的生成:建表 -> 预览 -> 生成 -> 验证 -> 重启 -> 使用。整个过程约 1 分钟,生成约 12 个文件,涵盖后端 MVC + 前端页面 + 路由注册 + 菜单权限。生成后根据业务需求进行微调即可投入使用。