Files
api/app/querydict.py
2025-12-30 11:27:14 +07:00

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)