Initial commit (Clean history)
This commit is contained in:
49
app/querydict.py
Normal file
49
app/querydict.py
Normal file
@@ -0,0 +1,49 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user