diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 8803375..b4947e8 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -89,12 +89,13 @@ class Field(object):
             editable=True, serialize=True, prepopulate_from=None,
             unique_for_date=None, unique_for_month=None, unique_for_year=None,
             validator_list=None, choices=None, radio_admin=None, help_text='',
-            db_column=None, db_tablespace=None, auto_created=False):
+            db_column=None, db_tablespace=None, auto_created=False, use_property=None):
         self.name = name
         self.verbose_name = verbose_name
         self.primary_key = primary_key
         self.max_length, self.unique = max_length, unique
         self.blank, self.null = blank, null
+        self.model_property = use_property
         # Oracle treats the empty string ('') as null, so coerce the null
         # option whenever '' is a possible value.
         if self.empty_strings_allowed and settings.DATABASE_ENGINE == 'oracle':
@@ -202,6 +203,12 @@ class Field(object):
         cls._meta.add_field(self)
         if self.choices:
             setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
+        if self.model_property:
+            if len(self.model_property) < 2:
+                raise ValueError("You must specify at least a getter and a setter method")
+            # Create a property on ``cls`` with the methods given.
+            setattr(cls, '%s' % self.name, 
+                property(*self.model_property))
 
     def get_attname(self):
         return self.name
diff --git a/docs/model-api.txt b/docs/model-api.txt
index 4ed4ede..1e1129a 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -665,6 +665,29 @@ unless you want to override the default primary-key behavior.
 ``primary_key=True`` implies ``blank=False``, ``null=False`` and
 ``unique=True``. Only one primary key is allowed on an object.
 
+``use_property``
+~~~~~~~~~~~~~~~~
+
+It is possible to create a property around a field. It is specially usefull if
+you want to control when the value for a field gets changed or accessed.
+
+The ``use_property`` option takes a tuple of the parameters that will be passed to
+``property()`` to construct it.
+
+But note that at least getter and setter functions must be given.
+
+Example::
+
+    from django.db import models
+
+    class Person(models.Model):
+        def _get_name(self):
+            return self.__name
+        def _set_name(self, value):
+            self.__name = value
+
+        name = models.CharField(max_length=30, use_property=(_get_name, _set_name))
+
 ``radio_admin``
 ~~~~~~~~~~~~~~~
 
diff --git a/tests/modeltests/properties/models.py b/tests/modeltests/properties/models.py
index 5326e4e..9aa2c55 100644
--- a/tests/modeltests/properties/models.py
+++ b/tests/modeltests/properties/models.py
@@ -20,6 +20,15 @@ class Person(models.Model):
 
     full_name_2 = property(_get_full_name, _set_full_name)
 
+class PropModel(models.Model):
+    def _set_name(self, value):
+        self.__name = value
+
+    def _get_name(self):
+        return self.__name
+
+    name = models.CharField(max_length=30, use_property=(_get_name, _set_name))
+
 __test__ = {'API_TESTS':"""
 >>> a = Person(first_name='John', last_name='Lennon')
 >>> a.save()
@@ -37,4 +46,16 @@ AttributeError: can't set attribute
 >>> a2.save()
 >>> a2.first_name
 'Paul'
+
+# Now the field properties
+>>> b = PropModel(name='John')
+>>> b.save()
+>>> b.name
+'John'
+>>> b._get_name()
+'John'
+>>> b.name = 'Smith'
+>>> b._get_name()
+'Smith'
 """}
+
