1. 程式人生 > 其它 >字典表設計及Django中的實現--超詳細

字典表設計及Django中的實現--超詳細

技術標籤:Django字典表設計字典表djangopython字典表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"
}