Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #1683 -- Permit initialising models using settable properties a…

…s well as

field names.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@3145 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 1fc3b3229a9b137f05a0a49bdc726f8c91317174 1 parent 214d88c
@malcolmt malcolmt authored
Showing with 18 additions and 0 deletions.
  1. +6 −0 django/db/models/base.py
  2. +12 −0 tests/modeltests/properties/models.py
View
6 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):
View
12 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'
"""
Please sign in to comment.
Something went wrong with that request. Please try again.