Index: django/contrib/sessions/tests.py
===================================================================
--- django/contrib/sessions/tests.py	(revision 6812)
+++ django/contrib/sessions/tests.py	(working copy)
@@ -66,6 +66,11 @@
 >>> s.accessed, s.modified
 (True, False)
 
+>>> s.setdefault('foo', 'bar')
+'bar'
+>>> s.setdefault('foo', 'baz')
+'bar'
+
 >>> s.accessed = False  # Reset the accessed flag
 
 >>> s.pop('some key')
Index: django/contrib/sessions/backends/base.py
===================================================================
--- django/contrib/sessions/backends/base.py	(revision 6812)
+++ django/contrib/sessions/backends/base.py	(working copy)
@@ -51,6 +51,14 @@
         self.modified = self.modified or key in self._session
         return self._session.pop(key, *args)
 
+    def setdefault(self, key, value):
+        if key in self._session:
+            return self._session[key]
+        else:
+            self.modified = True
+            self._session[key] = value
+            return value
+
     def set_test_cookie(self):
         self[self.TEST_COOKIE_NAME] = self.TEST_COOKIE_VALUE
 
