Fixed #1683 -- Permit initialising models using settable properties as well as
field names. git-svn-id: http://code.djangoproject.com/svn/django/trunk@3145 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
214d88ce86
commit
1fc3b3229a
|
@ -107,6 +107,12 @@ class Model(object):
|
||||||
else:
|
else:
|
||||||
val = kwargs.pop(f.attname, f.get_default())
|
val = kwargs.pop(f.attname, f.get_default())
|
||||||
setattr(self, f.attname, val)
|
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:
|
if kwargs:
|
||||||
raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
|
raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
|
||||||
for i, arg in enumerate(args):
|
for i, arg in enumerate(args):
|
||||||
|
|
|
@ -12,8 +12,14 @@ class Person(models.Model):
|
||||||
|
|
||||||
def _get_full_name(self):
|
def _get_full_name(self):
|
||||||
return "%s %s" % (self.first_name, self.last_name)
|
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 = property(_get_full_name)
|
||||||
|
|
||||||
|
full_name_2 = property(_get_full_name, _set_full_name)
|
||||||
|
|
||||||
API_TESTS = """
|
API_TESTS = """
|
||||||
>>> a = Person(first_name='John', last_name='Lennon')
|
>>> a = Person(first_name='John', last_name='Lennon')
|
||||||
>>> a.save()
|
>>> a.save()
|
||||||
|
@ -25,4 +31,10 @@ API_TESTS = """
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
AttributeError: can't set attribute
|
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'
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue