From 0f5a822a2a1adab8e1c41c0465e9de1929f58b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 24 Dec 2017 17:26:03 +0100 Subject: [PATCH] hopefully fix finally the wrapped ReverseOneToOneDescriptor issue --- src/c3nav/editor/wrappers.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index 0124e610..e1a7ee48 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -205,7 +205,22 @@ class ModelInstanceWrapper(BaseWrapper): def __getattr__(self, name): descriptor = getattr(self._obj.__class__, name, None) if isinstance(descriptor, ReverseOneToOneDescriptor): - return descriptor.__get__(self, self.__class__) + try: + rel_obj = getattr(self._obj, descriptor.cache_name) + except AttributeError: + related_pk = self._obj._get_pk_val() + if related_pk is None: + rel_obj = None + else: + related_model = self._wrap_model(descriptor.related.related_model) + filter_args = descriptor.related.field.get_forward_related_filter(self._obj) + try: + rel_obj = related_model.objects.get(**filter_args) + except related_model.DoesNotExist: + rel_obj = None + else: + setattr(rel_obj, descriptor.related.field.get_cache_name(), self._obj) + setattr(self._obj, descriptor.cache_name, rel_obj) return super().__getattr__(name) def __setattr__(self, name, value):