字典表设计及Django中的实现--超详细

python学习交流公众号 Hello Python上线啦,欢迎关注

一:字典表使用场景
  1. 维护系统中的某些变量,特别是后期可能修改的变量,将其从代码中抽离出来。
  2. 前端下拉框,多选框等用户交互数据。
  3. 维护目录树,分类等。
二:字典表设计
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"
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值