diff --git a/django/db/models/base.py b/django/db/models/base.py index e19c5e44ec..591b3f3c6b 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -79,34 +79,33 @@ class Model(object): def __init__(self, *args, **kwargs): dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs) - if kwargs: - for f in self._meta.fields: - if isinstance(f.rel, ManyToOneRel): + for f in self._meta.fields: + if isinstance(f.rel, ManyToOneRel): + try: + # Assume object instance was passed in. + rel_obj = kwargs.pop(f.name) + except KeyError: try: - # Assume object instance was passed in. - rel_obj = kwargs.pop(f.name) + # Object instance wasn't passed in -- must be an ID. + val = kwargs.pop(f.attname) except KeyError: - try: - # Object instance wasn't passed in -- must be an ID. - val = kwargs.pop(f.attname) - except KeyError: - val = f.get_default() - else: - # Object instance was passed in. - # Special case: You can pass in "None" for related objects if it's allowed. - if rel_obj is None and f.null: - val = None - else: - try: - val = getattr(rel_obj, f.rel.get_related_field().attname) - except AttributeError: - raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj)) - setattr(self, f.attname, val) + val = f.get_default() else: - val = kwargs.pop(f.attname, f.get_default()) - setattr(self, f.attname, val) - if kwargs: - raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] + # Object instance was passed in. + # Special case: You can pass in "None" for related objects if it's allowed. + if rel_obj is None and f.null: + val = None + else: + try: + val = getattr(rel_obj, f.rel.get_related_field().attname) + except AttributeError: + raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj)) + setattr(self, f.attname, val) + else: + val = kwargs.pop(f.attname, f.get_default()) + setattr(self, f.attname, val) + if kwargs: + raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] for i, arg in enumerate(args): setattr(self, self._meta.fields[i].attname, arg) dispatcher.send(signal=signals.post_init, sender=self.__class__, instance=self)