Loading django/db/models/base.py +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ class Model(object): 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): Loading tests/modeltests/properties/models.py +12 −0 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -25,4 +31,10 @@ API_TESTS = """ 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' """ Loading
django/db/models/base.py +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ class Model(object): 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): Loading
tests/modeltests/properties/models.py +12 −0 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -25,4 +31,10 @@ API_TESTS = """ 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' """