diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py index 17140aa00f53d531740c1054cc6f18eb0ccfe2f9..39f19ca941509164c3103bac950d1859d1a53719 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}))