尝试创建交叉兼容的保序QueryDict
子类时:
from collections import OrderedDict
from django.http import QueryDict
from django.conf import settings
settings.configure()
class OrderedQueryDict(QueryDict, OrderedDict):
pass
querystring = 'z=33&x=11'
print(QueryDict(querystring).urlencode())
print(OrderedQueryDict(querystring).urlencode())
Python3.x上的输出(正确和预期的结果):
z=33&x=11 # or maybe x=11,z=33 on Python<=3.5
z=33&x=11
Python 2.7上的输出(此查询字符串已损坏):
x=11&z=33
z=3&z=3&x=1&x=1
为什么这个想法适用于python3而不适用于python2?
Django v1.11.20版。你知道吗
TLDR:重新实现
lists
:对于完整的功能,
iterlists
也应该重新实现。你知道吗问题是Django的
MultiValueDict
覆盖了__getitem__
只检索最后一个值,而getlist
检索所有值。这隐式地依赖于不使用重写方法的底层映射的其他方法。例如,它依赖于super().iteritems
能够检索值列表:original code使用
six
覆盖python2和python3。这就是Python 2执行的内容:在Python 2中,
OrderedDict
是用纯Python实现的,并依赖self[key]
,即__getitem__
来检索值:因此,它从MRO获取被重写的
__getitem__
,并且只返回单个值,而不是整个列表。你知道吗这个问题在大多数python3.5+的构建中都被回避了,因为
OrderedDict
通常有一个C实现可用,意外地屏蔽了它的方法,使其不使用重写的方法。你知道吗相关问题 更多 >
编程相关推荐