From d8c992f995691058e225083c78efad24aec7183e Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 15 Nov 2020 23:32:11 +0100
Subject: [PATCH] Only generate proxy properties once for related syncable
 fields

---
 aleksis/core/mixins.py | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index 17140aa00..39f19ca94 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -288,22 +288,23 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
                     name = f"_{field.name}__{subfield.name}"
                     verbose_name = f"{field.verbose_name} -> {subfield.verbose_name}"
 
-                    # Add proxy properties to handle access to related model
-                    def getter(self):
-                        if hasattr(self, field.name):
-                            related = getattr(self, field.name)
-                            return getattr(related, subfield.name)
-                        # Related instane does not exist
-                        return None
-                    def setter(self, val):
-                        if hasattr(self, field.name):
-                            related = getattr(self, field.name)
-                        else:
-                            # Auto-create related instance (but do not save)
-                            related = field.related_model()
-                            setattr(related, field.remote_field.name, self)
-                        setattr(related, subfield.name, val)
-                    setattr(cls, name, property(getter, setter))
+                    if not hasattr(cls, name):
+                        # Add proxy properties to handle access to related model
+                        def getter(self):
+                            if hasattr(self, field.name):
+                                related = getattr(self, field.name)
+                                return getattr(related, subfield.name)
+                            # Related instane does not exist
+                            return None
+                        def setter(self, val):
+                            if hasattr(self, field.name):
+                                related = getattr(self, field.name)
+                            else:
+                                # Auto-create related instance (but do not save)
+                                related = field.related_model()
+                                setattr(related, field.remote_field.name, self)
+                            setattr(related, subfield.name, val)
+                        setattr(cls, name, property(getter, setter))
 
                     # Generate a fake field class with enough API to detect attribute names
                     fields.append(type("FakeRelatedProxyField", (), {"name": name, "verbose_name": verbose_name}))
-- 
GitLab