Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 8350)
+++ django/db/models/fields/related.py	(working copy)
@@ -409,6 +409,37 @@
             return new_obj
         create.alters_data = True
 
+        def get_or_create(self, **kwargs):
+            # This check needs to be done here, since we can't later remove this
+            # from the method lookup table, as we do with add and remove.
+            if through is not None:
+                raise AttributeError, "Cannot use get_or_create() on a ManyToManyField which specifies an intermediary model. Use %s's Manager instead." % through
+            assert kwargs, \
+                    'get_or_create() must be passed at least one keywoard argument'
+            defaults = kwargs.pop('defaults', {})
+            try:
+                obj = self.get(**kwargs)
+            except self.model.DoesNotExist:
+                try:
+                    params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
+                    params.update(defaults)
+                    obj = self.model(**params)
+                    sid = transaction.savepoint()
+                    obj.save()
+                    transaction.savepoint_commit(sid)
+                except IntegrityError, e:
+                    tranasction.savepoint_rollback(sid)
+                    obj = self.get(**kwargs)
+                    self.add(obj)
+                    return obj, False
+                else:
+                    self.add(obj)
+                    return obj, True
+            else:
+                self.add(obj)
+                return obj, False
+        get_or_create.alters_data = True
+
         def _add_items(self, source_col_name, target_col_name, *objs):
             # join_table: name of the m2m link table
             # source_col_name: the PK colname in join_table for the source object
