字典表設計及Django中的實現--超詳細
阿新 • • 發佈:2020-12-20
技術標籤:Django字典表設計字典表djangopython字典表django字典表
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"
}