Index: db/models/base.py
===================================================================
--- db/models/base.py	(revision 5079)
+++ db/models/base.py	(working copy)
@@ -88,6 +88,35 @@
     def __str__(self):
         return '%s object' % self.__class__.__name__
 
+    def is_equal(self, other, excludes = None):
+        """
+        Returns a boolean if the two instances of a model are equal.
+        If ``excludes`` is specified, all fields with the names given in
+        ``excludes`` will not be considered in the comparison.
+        If ``excludes`` is not specified, it will default to be the
+        primary key.
+        """
+        if self is other: return True
+        if type(self) != type(other): return False
+
+        # TODO: Handle for multiple pk fields if that ever happens
+        field_excludes = []
+        if excludes is not None:
+            field_excludes += excludes
+        if self._meta.equality_exclude is not None:
+            field_excludes += self._meta.equality_exclude
+        if excludes is None and self._meta.equality_exclude is None:
+            field_excludes = [self._meta.pk.attname]       
+
+        field_names = [field.attname for field in self._meta.fields
+                       if field.attname not in field_excludes           ]
+
+        for field_name in field_names:
+            if getattr(self, field_name) != getattr(other, field_name):
+                return False
+        return True
+       
+
     def __eq__(self, other):
         return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
 
Index: db/models/options.py
===================================================================
--- db/models/options.py	(revision 5079)
+++ db/models/options.py	(working copy)
@@ -33,6 +33,7 @@
         self.has_auto_field = False
         self.one_to_one_field = None
         self.parents = []
+        self.equality_exclude = None
 
     def contribute_to_class(self, cls, name):
         cls._meta = self
