?ids=1&ids=2&ids=3 进了 request.GET 变成什么?为什么 int(request.GET["ids"]) 只拿到 3?这篇把 QueryDict 的每个取值方式都在同一组数据上跑一遍,再看字段数量限制。
QueryDict = <QueryDict: {'a': ['1', '2'], 'b': ['x'], 'tag': ['py', 'django', 'orm'], 'empty': ['']}>
q['a'] = '2' ← 直接下标取到的是最后一个值
q.get('a') = '2'
q.getlist('a') = ['1', '2']
q.getlist('tag') = ['py', 'django', 'orm']
q.get('missing') = None q.get('missing','dflt') = dflt q.getlist('missing') = []
q.get('empty') = ''
dict(q) = {'a': ['1', '2'], 'b': ['x'], 'tag': ['py', 'django', 'orm'], 'empty': ['']}
q.dict() = {'a': '2', 'b': 'x', 'tag': 'orm', 'empty': ''} ← 每个 key 只留最后一个值
list(q.items()) = [('a', '2'), ('b', 'x'), ('tag', 'orm'), ('empty', '')]
list(q.lists()) = [('a', ['1', '2']), ('b', ['x']), ('tag', ['py', 'django', 'orm']), ('empty', [''])]
len(q) = 4 (key 的个数,不是参数个数) q.keys() 顺序 = ['a', 'b', 'tag', 'empty']QueryDict 是「一个 key 对应多个值」的字典:大部分接口(下标、get、items、dict() 方法)只返回最后一个,少数(getlist、lists、内置 dict(q))返回全部。
q._mutable = False
q['a'] = '3' → AttributeError: This QueryDict instance is immutable
copy() 之后赋值/追加: <QueryDict: {'a': ['3', '4'], 'b': ['x', 'y']}> getlist("a") = ['3', '4']
urlencode() = a=3&a=4&b=x&b=y
解码后: {'q': ['中文'], 'x': ['a b'], 'y': ['&']} 再 urlencode(): q=%E4%B8%AD%E6%96%87&x=a+b&y=%26
safe 参数保留 "/" : next=/a/b/%3Fc%3D1request.GET / request.POST 是不可变的;构造新的查询串用 copy() + urlencode(),中文与保留字符自动编码。
request.GET.get("ids") = 3 getlist = ['1', '2', '3']
int(request.GET["ids"]) = 3 (只取到最后一个)
POST 表单里 ids=[1,2,3]: getlist = ['1', '2', '3'] get = 3多选框、多个同名参数,一定要用 getlist。JSON 请求体里没有「重复 key」这回事,那是解析后的数组。
DATA_UPLOAD_MAX_NUMBER_FIELDS 默认 = 1000 POST 表单 1000 个字段 → request.POST 里 1000 个 POST 表单 1001 个字段 → TooManyFieldsSent: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS. GET 查询串 1000 个参数 → request.GET 里 1000 个 GET 查询串 1001 个参数 → TooManyFieldsSent: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.
GET 查询串也受限制(实验里是在访问 len(request.GET) 时抛出)。1000 个刚好通过,1001 个抛 TooManyFieldsSent。