summaryrefslogtreecommitdiff
path: root/django/core/cache
diff options
context:
space:
mode:
authorOlivier Tabone <olivier.tabone@ripplemotion.fr>2016-11-06 12:57:38 +0100
committerTim Graham <timograham@gmail.com>2017-09-06 14:38:44 -0400
commita027447f5606d60358e5da76c0e8233732ad2b17 (patch)
tree6e06934fc26d48fc59ccb5f45c3800368e625aad /django/core/cache
parent407c1249c9a0296ec8a8d95e447bd695ca471b5e (diff)
Fixed #27318 -- Made cache.set_many() return the list of failed keys.
Diffstat (limited to 'django/core/cache')
-rw-r--r--django/core/cache/backends/base.py4
-rw-r--r--django/core/cache/backends/memcached.py13
2 files changed, 12 insertions, 5 deletions
diff --git a/django/core/cache/backends/base.py b/django/core/cache/backends/base.py
index a0ed8275f9..aaf34c042e 100644
--- a/django/core/cache/backends/base.py
+++ b/django/core/cache/backends/base.py
@@ -206,9 +206,13 @@ class BaseCache:
If timeout is given, use that timeout for the key; otherwise use the
default cache timeout.
+
+ On backends that support it, return a list of keys that failed
+ insertion, or an empty list if all keys were inserted successfully.
"""
for key, value in data.items():
self.set(key, value, timeout=timeout, version=version)
+ return []
def delete_many(self, keys, version=None):
"""
diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py
index 5af28d7ac3..d49fd148fd 100644
--- a/django/core/cache/backends/memcached.py
+++ b/django/core/cache/backends/memcached.py
@@ -134,11 +134,14 @@ class BaseMemcachedCache(BaseCache):
return val
def set_many(self, data, timeout=DEFAULT_TIMEOUT, version=None):
- safe_data = {
- self.make_key(key, version=version): value
- for key, value in data.items()
- }
- self._cache.set_multi(safe_data, self.get_backend_timeout(timeout))
+ safe_data = {}
+ original_keys = {}
+ for key, value in data.items():
+ safe_key = self.make_key(key, version=version)
+ safe_data[safe_key] = value
+ original_keys[safe_key] = key
+ failed_keys = self._cache.set_multi(safe_data, self.get_backend_timeout(timeout))
+ return [original_keys[k] for k in failed_keys]
def delete_many(self, keys, version=None):
self._cache.delete_multi(self.make_key(key, version=version) for key in keys)