50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
import re
|
|
|
|
def parse_querydict_nested(qdict):
|
|
"""
|
|
Chuyển QueryDict thành dict, xử lý các key dạng a[b][c] thành dict lồng nhau.
|
|
"""
|
|
result = {}
|
|
|
|
for key in qdict.keys():
|
|
values = qdict.getlist(key)
|
|
|
|
# Tách key theo cấu trúc a[b][c]
|
|
parts = re.findall(r'([^\[\]]+)', key)
|
|
current = result
|
|
|
|
for i, part in enumerate(parts):
|
|
if i == len(parts) - 1:
|
|
# Gán giá trị cuối
|
|
current[part] = values if len(values) > 1 else values[0]
|
|
else:
|
|
if part not in current:
|
|
current[part] = {}
|
|
current = current[part]
|
|
|
|
return result
|
|
|
|
def simplify_indexed_dict(d):
|
|
"""
|
|
Nếu dict có toàn key số (0,1,2,...), chuyển thành list.
|
|
Đệ quy áp dụng cho dict và list con.
|
|
"""
|
|
if isinstance(d, dict):
|
|
keys = d.keys()
|
|
if all(k.isdigit() for k in keys):
|
|
# Convert dict có key dạng số thành list
|
|
return [simplify_indexed_dict(d[k]) for k in sorted(keys, key=int)]
|
|
else:
|
|
return {k: simplify_indexed_dict(v) for k, v in d.items()}
|
|
elif isinstance(d, list):
|
|
return [simplify_indexed_dict(i) for i in d]
|
|
else:
|
|
return d
|
|
|
|
def querydict_to_nested_dict(qdict):
|
|
"""
|
|
Hàm chính: từ QueryDict trả về dict lồng đã đơn giản hóa.
|
|
"""
|
|
raw_nested = parse_querydict_nested(qdict)
|
|
return simplify_indexed_dict(raw_nested)
|