diff --git a/django/core/meta/__init__.py b/django/core/meta/__init__.py index a8cd4112a1..b61057662c 100644 --- a/django/core/meta/__init__.py +++ b/django/core/meta/__init__.py @@ -754,12 +754,13 @@ def method_init(opts, self, *args, **kwargs): 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.field_name) + 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) @@ -892,7 +893,12 @@ def method_get_many_to_one(field_with_rel, self): mod = field_with_rel.rel.to.get_model_module() if val is None: raise getattr(mod, '%sDoesNotExist' % field_with_rel.rel.to.object_name) - retrieved_obj = mod.get_object(**{'%s__exact' % field_with_rel.rel.field_name: val}) + other_field = field_with_rel.rel.get_related_field() + if other_field.rel: + params = {'%s__%s__exact' % (field_with_rel.rel.field_name, other_field.rel.field_name): val} + else: + params = {'%s__exact'% field_with_rel.rel.field_name: val} + retrieved_obj = mod.get_object(**params) setattr(self, cache_var, retrieved_obj) return getattr(self, cache_var)