Index: db/models/options.py
===================================================================
--- db/models/options.py	(revision 4556)
+++ db/models/options.py	(working copy)
@@ -13,7 +13,7 @@
 
 DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
                  'unique_together', 'permissions', 'get_latest_by',
-                 'order_with_respect_to', 'app_label')
+                 'order_with_respect_to', 'app_label', 'restrict_delete')
 
 class Options(object):
     def __init__(self, meta):
@@ -33,6 +33,7 @@
         self.has_auto_field = False
         self.one_to_one_field = None
         self.parents = []
+        self.restrict_delete = False
 
     def contribute_to_class(self, cls, name):
         cls._meta = self
Index: db/models/base.py
===================================================================
--- db/models/base.py	(revision 4556)
+++ db/models/base.py	(working copy)
@@ -1,7 +1,7 @@
 import django.db.models.manipulators
 import django.db.models.manager
 from django.core import validators
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, IntegrityError
 from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
 from django.db.models.fields.related import OneToOneRel, ManyToOneRel
 from django.db.models.query import delete_objects
@@ -238,7 +238,7 @@
                 error_dict[f.name] = errors
         return error_dict
 
-    def _collect_sub_objects(self, seen_objs):
+    def _collect_sub_objects(self, seen_objs, restrict_delete=False):
         """
         Recursively populates seen_objs with all objects related to this object.
         When done, seen_objs will be in the format:
@@ -250,7 +250,8 @@
             return
         seen_objs.setdefault(self.__class__, {})[pk_val] = self
 
-        for related in self._meta.get_all_related_objects():
+        has_nonfollows = False
+        for related in self._meta.get_all_related_objects():
             rel_opts_name = related.get_accessor_name()
             if isinstance(related.field.rel, OneToOneRel):
                 try:
@@ -258,17 +259,30 @@
                 except ObjectDoesNotExist:
                     pass
                 else:
+                    # If the item in question isn't from a 'followed' field, don't continue - this should trigger RESTRICT.
+                    if restrict_delete and not related.get_follow():
+                        has_nonfollows = True
+                        break
                     sub_obj._collect_sub_objects(seen_objs)
             else:
+                # If we find a count for this relation and the field is not a 'followed' one, trigger RESTRICT.
+                if restrict_delete and not related.get_follow() and getattr(self,rel_opts_name).count():
+                    has_nonfollows=True
+                    break
                 for sub_obj in getattr(self, rel_opts_name).all():
                     sub_obj._collect_sub_objects(seen_objs)
 
+        # This will only be true if restrict_delete is True and we found related non-followed objects
+        if has_nonfollows:
+            raise IntegrityError, "The requested object could not be deleted because it is referenced by other objects."
+
+
     def delete(self):
         assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)
 
         # Find all the objects than need to be deleted
         seen_objs = SortedDict()
-        self._collect_sub_objects(seen_objs)
+        self._collect_sub_objects(seen_objs,self._meta.restrict_delete)
 
         # Actually delete the objects
         delete_objects(seen_objs)
Index: core/exceptions.py
===================================================================
--- core/exceptions.py	(revision 4556)
+++ core/exceptions.py	(working copy)
@@ -23,3 +23,7 @@
 class ImproperlyConfigured(Exception):
     "Django is somehow improperly configured"
     pass
+
+class IntegrityError(Exception):
+    "The requested object could not be deleted because it is referenced by other objects"
+    pass
