Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

[1.3.X] Fixed #17634 -- Optimized the performance of MultiValueDict b…

…y using append instead of copy and by minimizing the number of dict lookups. Backport of r17464 from trunk.

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 15fb61c commit 0bbe7379ee3e2cb290f9c9e841bb2f1457e14b16 @aaugustin aaugustin committed
15 django/utils/
@@ -319,17 +319,20 @@ def setlist(self, key, list_):
def setdefault(self, key, default=None):
if key not in self:
self[key] = default
+ return default
return self[key]
- def setlistdefault(self, key, default_list=()):
+ def setlistdefault(self, key, default_list=None):
if key not in self:
+ if default_list is None:
+ default_list = []
self.setlist(key, default_list)
+ return default_list
return self.getlist(key)
def appendlist(self, key, value):
"""Appends an item to the internal list associated with key."""
- self.setlistdefault(key, [])
- super(MultiValueDict, self).__setitem__(key, self.getlist(key) + [value])
+ self.setlistdefault(key).append(value)
def items(self):
@@ -378,15 +381,15 @@ def update(self, *args, **kwargs):
other_dict = args[0]
if isinstance(other_dict, MultiValueDict):
for key, value_list in other_dict.lists():
- self.setlistdefault(key, []).extend(value_list)
+ self.setlistdefault(key).extend(value_list)
for key, value in other_dict.items():
- self.setlistdefault(key, []).append(value)
+ self.setlistdefault(key).append(value)
except TypeError:
raise ValueError("MultiValueDict.update() takes either a MultiValueDict or dictionary")
for key, value in kwargs.iteritems():
- self.setlistdefault(key, []).append(value)
+ self.setlistdefault(key).append(value)
class DotExpandedDict(dict):
6 tests/regressiontests/utils/
@@ -212,6 +212,12 @@ def test_multivaluedict(self):
['Developer', 'Simon', 'Willison'])
+ def test_appendlist(self):
+ d = MultiValueDict()
+ d.appendlist('name', 'Adrian')
+ d.appendlist('name', 'Simon')
+ self.assertEqual(d.getlist('name'), ['Adrian', 'Simon'])
def test_copy(self):
for copy_func in [copy, lambda d: d.copy()]:
d1 = MultiValueDict({

0 comments on commit 0bbe737

Please sign in to comment.
Something went wrong with that request. Please try again.