--- django/db/models/base.py	2009-07-07 13:33:43.000000000 +0800
+++ django/db/models/base.py	2009-07-07 13:39:49.000000000 +0800
@@ -240,8 +240,18 @@
 class Model(object):
     __metaclass__ = ModelBase
     _deferred = False
+    
+    def __setattr__(self, name, value):
+        if name not in self._modified_attrs:
+            if not hasattr(self, name) or value != getattr(self, name):
+                self._modified_attrs.append(name)
+        super(Model, self).__setattr__(name, value)
+    
+    def _reset_modified_attrs(self):
+        self.__dict__['_modified_attrs'] = []
 
     def __init__(self, *args, **kwargs):
+        self._reset_modified_attrs()
         signals.pre_init.send(sender=self.__class__, args=args, kwargs=kwargs)
 
         # There is a rather weird disparity here; if kwargs, it's set, then args
@@ -458,7 +468,10 @@
 
         if not meta.proxy:
             non_pks = [f for f in meta.local_fields if not f.primary_key]
-
+            modified_attrs = self._modified_attrs
+            non_pks = [f for f in non_pks if (f.name in modified_attrs or f.attname in modified_attrs)]
+            self._reset_modified_attrs()
+            
             # First, try an UPDATE. If that doesn't update anything, do an INSERT.
             pk_val = self._get_pk_val(meta)
             pk_set = pk_val is not None
--- django/db/models/query.py	2009-07-07 13:33:43.000000000 +0800
+++ django/db/models/query.py	2009-07-07 13:44:21.000000000 +0800
@@ -249,6 +249,10 @@
                 else:
                     # Omit aggregates in object creation.
                     obj = self.model(*row[index_start:aggregate_start])
+                    # Models keep a track of modified attrs to choose which
+                    # fields to save. Since we're just pulling from the 
+                    # database, nothing has changed yet. 
+                    obj._reset_modified_attrs()
 
             for i, k in enumerate(extra_select):
                 setattr(obj, k, row[i])
