Skip to content
Snippets Groups Projects
Verified Commit d8c992f9 authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Only generate proxy properties once for related syncable fields

parent dde5cb60
No related branches found
No related tags found
1 merge request!396Resolve "Support syncing fields across foreign keys"
...@@ -288,22 +288,23 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): ...@@ -288,22 +288,23 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
name = f"_{field.name}__{subfield.name}" name = f"_{field.name}__{subfield.name}"
verbose_name = f"{field.verbose_name} -> {subfield.verbose_name}" verbose_name = f"{field.verbose_name} -> {subfield.verbose_name}"
# Add proxy properties to handle access to related model if not hasattr(cls, name):
def getter(self): # Add proxy properties to handle access to related model
if hasattr(self, field.name): def getter(self):
related = getattr(self, field.name) if hasattr(self, field.name):
return getattr(related, subfield.name) related = getattr(self, field.name)
# Related instane does not exist return getattr(related, subfield.name)
return None # Related instane does not exist
def setter(self, val): return None
if hasattr(self, field.name): def setter(self, val):
related = getattr(self, field.name) if hasattr(self, field.name):
else: related = getattr(self, field.name)
# Auto-create related instance (but do not save) else:
related = field.related_model() # Auto-create related instance (but do not save)
setattr(related, field.remote_field.name, self) related = field.related_model()
setattr(related, subfield.name, val) setattr(related, field.remote_field.name, self)
setattr(cls, name, property(getter, setter)) setattr(related, subfield.name, val)
setattr(cls, name, property(getter, setter))
# Generate a fake field class with enough API to detect attribute names # Generate a fake field class with enough API to detect attribute names
fields.append(type("FakeRelatedProxyField", (), {"name": name, "verbose_name": verbose_name})) fields.append(type("FakeRelatedProxyField", (), {"name": name, "verbose_name": verbose_name}))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment