Fix backreferences to the same table

This commit is contained in:
evilchili
2025-09-29 23:40:25 -07:00
parent de72d38b8f
commit 40b6650970
3 changed files with 16 additions and 7 deletions
+1
View File
@@ -21,4 +21,5 @@ class Group(Record):
Field("name", unique=True),
Collection("members", User),
Collection("groups", Group),
BackReference("parent", Group),
]
+11 -7
View File
@@ -127,15 +127,19 @@ class Pointer(Field):
value_type: type = Record
def serialize(self, value: value_type) -> str:
return Pointer.reference(value)
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
return Pointer.dereference(value, db, recurse)
@classmethod
def reference(cls, value: Record):
if value:
if not value.doc_id:
raise PointerReferenceError(value)
return f"{value._metadata.table}::{value.uid}"
return None
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
return Pointer.dereference(value, db, recurse)
@classmethod
def dereference(cls, value: str, db: TinyDB, recurse: bool = True):
if not value:
@@ -186,7 +190,7 @@ class Collection(Field):
return
for member in record[self.name]:
reference = Pointer.dereference(member, db=db)
for backref in reference._metadata.backrefs(type(record)):
reference[backref.name] = record
db.table(reference._metadata.table).upsert(reference)
target = Pointer.dereference(member, db=db)
for backref in target._metadata.backrefs(type(record)):
target[backref.name] = Pointer.reference(record)
db.table(target._metadata.table).update({backref.name: record}, where("uid") == target.uid)