Index: django/db/models/base.py
===================================================================
--- django/db/models/base.py	(revision 5079)
+++ django/db/models/base.py	(working copy)
@@ -2,7 +2,7 @@
 import django.db.models.manager
 from django.core import validators
 from django.core.exceptions import ObjectDoesNotExist
-from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
+from django.db.models.fields import Field, AutoField, ImageField, FieldDoesNotExist
 from django.db.models.fields.related import OneToOneRel, ManyToOneRel
 from django.db.models.query import delete_objects
 from django.db.models.options import Options, AdminOptions
@@ -88,6 +88,34 @@
     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
+
+        # if pk happens to be a list of fields,
+        # we should deal with that
+        if excludes is None:
+            if isinstance(type(self)._meta.pk, Field):
+                excludes = [type(self)._meta.pk.attname]
+            else:
+                excludes = [field.attname for field in type(self)._meta.pk]
+
+        field_names = [field.attname for field in type(self)._meta.fields
+                       if field.attname not in excludes                  ]
+        print field_names
+        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()
 
