python学习交流公众号 Hello Python上线啦,欢迎关注
一:字典表使用场景
- 维护系统中的某些变量,特别是后期可能修改的变量,将其从代码中抽离出来。
- 前端下拉框,多选框等用户交互数据。
- 维护目录树,分类等。
二:字典表设计
CREATE TABLE `sys_dict` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`pid` int(11) DEFAULT '0' COMMENT ' 父ID ',
`dataName` varchar(200) DEFAULT NULL COMMENT '字典名',
`dataValue` varchar(200) NOT NULL COMMENT ' 数据名称/值 ',
`sortNo` int(11) unsigned DEFAULT '1' COMMENT ' 顺序 ',
`status` tinyint(2) DEFAULT '0' COMMENT '0正常,1删除',
`isFixed` tinyint(2) DEFAULT '0' COMMENT '0默认为不固定,1固定',
`dataDesc` varchar(400) DEFAULT NULL COMMENT '数据描述',
`updateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `SYS_DICT_PK` (`id`),
KEY `idx_dc_dt` (`dataType`,`dataCode`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='系统字典表';
这里示例,采用sql建表,也可使用Django orm建表,或使用inspectdb命令生成models代码
# default 是settings配置的名称,写入models.py 文件,也可终端输出吗,手动粘贴。
python manage.py inspectdb --database default > models.py
三:插入几条数据进行测试
插入几条数据,数据表如下所示,如果班级作为一类下拉框,小王,小李是选项。
四:代码实现
# SysDict是表实例的名称
from .models import SysDict
def get_new_dic_parse_new(data_old, data_new, DataModel):
"""
根据对象递归查找
:param data_old: 字典实例
:param data_new: 输出
:return: 处理后的字典,格式[{},{}]
"""
data_old_groups = DataModel.objects.filter(pid=data_old.id, status=0).order_by('sortno')
for quo_obj in data_old_groups:
if DataModel.objects.filter(pid=quo_obj.id):
data_new.append(
{'label': quo_obj.dataname, 'id': quo_obj.id, 'value':quo_obj.datavalue,
'children': get_new_dic_parse_new(quo_obj, [], DataModel)})
else:
data_new.append({'label': quo_obj.dataname, 'id': quo_obj.id, 'value':quo_obj.datavalue})
return data_new
class DictTable(View):
# 根据dataName输出相应的字典结构,可根据需求适当扩展或改造。
def get(self, request):
dict_name = request.GET.get('dict_name')
print(dict_name)
try:
dict_objs = SysDict.objects.filter(dataname=dict_name)
except Exception as e:
print(e)
return api_response(code=201, msg='No such dict')
response_data = []
for dict_obj in dict_objs:
response_data.append(
{
'lable': dict_obj.dataname,
'value': dict_obj.datavalue,
'children': get_new_dic_parse_new(dict_obj, data_new=[], DataModel=SysDict)
}
)
return api_response(code=200, msg='Succeed',data=response_data)
from django.http import HttpResponse
import json
def api_response(code, msg='', data='',):
"""
格式化返回
:param code:
:param msg:
:param data:
:return:
"""
return HttpResponse(json.dumps(dict(code=code, data=data, msg=msg),cls=ComplexEncoderSFM), content_type="application/json")
五:返回值
{
"code": 200,
"data": [
{
"lable": "banji",
"value": "班级",
"children": [
{
"label": "stu_name",
"id": 2,
"value": "小王",
"children": [
{
"label": "age",
"id": 4,
"value": "28"
},
{
"label": "height",
"id": 5,
"value": "175"
}
]
},
{
"label": "stu_name",
"id": 3,
"value": "小李"
}
]
}
],
"msg": "Succeed"
}