diff --git a/django/db/models/base.py b/django/db/models/base.py index 13c15d555ab25..7242e6baa7911 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -107,6 +107,12 @@ def __init__(self, *args, **kwargs): else: val = kwargs.pop(f.attname, f.get_default()) setattr(self, f.attname, val) + for prop in kwargs.keys(): + try: + if isinstance(getattr(self.__class__, prop), property): + setattr(self, prop, kwargs.pop(prop)) + except AttributeError: + pass if kwargs: raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] for i, arg in enumerate(args): diff --git a/tests/modeltests/properties/models.py b/tests/modeltests/properties/models.py index e9d8da95940c7..3b0133bf8a6de 100644 --- a/tests/modeltests/properties/models.py +++ b/tests/modeltests/properties/models.py @@ -12,8 +12,14 @@ class Person(models.Model): def _get_full_name(self): return "%s %s" % (self.first_name, self.last_name) + + def _set_full_name(self, combined_name): + self.first_name, self.last_name = combined_name.split(' ', 1) + full_name = property(_get_full_name) + full_name_2 = property(_get_full_name, _set_full_name) + API_TESTS = """ >>> a = Person(first_name='John', last_name='Lennon') >>> a.save() @@ -25,4 +31,10 @@ def _get_full_name(self): Traceback (most recent call last): ... AttributeError: can't set attribute + +# But "full_name_2" has, and it can be used to initialise the class. +>>> a2 = Person(full_name_2 = 'Paul McCartney') +>>> a2.save() +>>> a2.first_name +'Paul' """