check instance __getitem__ value first

This commit is contained in:
Catstyle 2014-12-09 18:56:52 +08:00
parent d7d399f8b6
commit 4d433b6513

View File

@ -59,15 +59,17 @@ def get_attribute(instance, attrs):
if instance is None: if instance is None:
# Break out early if we get `None` at any point in a nested lookup. # Break out early if we get `None` at any point in a nested lookup.
return None return None
if getattr(instance, '__getitem__', None):
try:
return instance[attr]
except (KeyError, TypeError, AttributeError):
pass
try: try:
instance = getattr(instance, attr) instance = getattr(instance, attr)
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
except AttributeError as exc: except AttributeError as exc:
try: raise exc
return instance[attr]
except (KeyError, TypeError, AttributeError):
raise exc
if is_simple_callable(instance): if is_simple_callable(instance):
instance = instance() instance = instance()
return instance return instance