Index: django/core/cache/backends/locmem.py
===================================================================
--- django/core/cache/backends/locmem.py	(revision 7922)
+++ django/core/cache/backends/locmem.py	(working copy)
@@ -31,15 +31,18 @@
 
     def add(self, key, value, timeout=None):
         self._lock.writer_enters()
+        success = False
         try:
             exp = self._expire_info.get(key)
             if exp is None or exp <= time.time():
                 try:
                     self._set(key, pickle.dumps(value), timeout)
+                    success = True
                 except pickle.PickleError:
                     pass
         finally:
             self._lock.writer_leaves()
+        return success
 
     def get(self, key, default=None):
         self._lock.reader_enters()
Index: django/core/cache/backends/filebased.py
===================================================================
--- django/core/cache/backends/filebased.py	(revision 7922)
+++ django/core/cache/backends/filebased.py	(working copy)
@@ -30,9 +30,10 @@
 
     def add(self, key, value, timeout=None):
         if self.has_key(key):
-            return None
+            return False
         
         self.set(key, value, timeout)
+        return True
 
     def get(self, key, default=None):
         fname = self._key_to_file(key)
Index: django/core/cache/backends/db.py
===================================================================
--- django/core/cache/backends/db.py	(revision 7922)
+++ django/core/cache/backends/db.py	(working copy)
@@ -44,6 +44,7 @@
         return self._base_set('add', key, value, timeout)
 
     def _base_set(self, mode, key, value, timeout=None):
+        inserted = False
         if timeout is None:
             timeout = self.default_timeout
         cursor = connection.cursor()
@@ -60,11 +61,14 @@
                 cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % self._table, [encoded, str(exp), key])
             else:
                 cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % self._table, [key, encoded, str(exp)])
+                inserted = True
         except DatabaseError:
             # To be threadsafe, updates/inserts are allowed to fail silently
             pass
         else:
             transaction.commit_unless_managed()
+        if mode == 'add':
+            return inserted
 
     def delete(self, key):
         cursor = connection.cursor()
Index: django/core/cache/backends/memcached.py
===================================================================
--- django/core/cache/backends/memcached.py	(revision 7922)
+++ django/core/cache/backends/memcached.py	(working copy)
@@ -17,7 +17,7 @@
         self._cache = memcache.Client(server.split(';'))
 
     def add(self, key, value, timeout=0):
-        self._cache.add(key.encode('ascii', 'ignore'), value, timeout or self.default_timeout)
+        return self._cache.add(key.encode('ascii', 'ignore'), value, timeout or self.default_timeout)
 
     def get(self, key, default=None):
         val = self._cache.get(smart_str(key))
Index: tests/regressiontests/cache/tests.py
===================================================================
--- tests/regressiontests/cache/tests.py	(revision 7922)
+++ tests/regressiontests/cache/tests.py	(working copy)
@@ -24,10 +24,12 @@
 
     def test_add(self):
         # test add (only add if key isn't already in cache)
-        cache.add("addkey1", "value")
-        cache.add("addkey1", "newvalue")
+        ret = cache.add("addkey1", "value")
+        self.assertTrue(ret)
+        ret = cache.add("addkey1", "newvalue")
+        self.assertFalse(ret)
         self.assertEqual(cache.get("addkey1"), "value")
-        
+
     def test_non_existent(self):
         # get with non-existent keys
         self.assertEqual(cache.get("does_not_exist"), None)
Index: docs/cache.txt
===================================================================
--- docs/cache.txt	(revision 7922)
+++ docs/cache.txt	(working copy)
@@ -387,10 +387,12 @@
 
 **New in Django development version:** To add a key only if it doesn't already
 exist, use the ``add()`` method. It takes the same parameters as ``set()``, but
-it will not attempt to update the cache if the key specified is already present::
+it will not attempt to update the cache if the key specified is already
+present.  If the key is already present, ``add()`` returns False::
 
     >>> cache.set('add_key', 'Initial value')
     >>> cache.add('add_key', 'New value')
+    False
     >>> cache.get('add_key')
     'Initial value'
 
