Key relationships
Simple case
from corm import Storage, Entity, KeyNested, Field
class SomeEntity(Entity):
id: int = Field(pk=True)
name: str
class EntityHolder(Entity):
name: str
entity: SomeEntity = KeyNested(
related_entity_field=SomeEntity.id,
origin='entity_id',
)
storage = Storage()
entity = SomeEntity({'id': 123, 'name': 'entity'}, storage=storage)
holder = EntityHolder({'entity_id': 123}, storage=storage)
assert holder.entity == entity
Bidirectional key relationships
from corm import (
Storage,
Field,
Entity,
KeyNested,
Relationship,
)
class SomeEntity(Entity):
id: int = Field(pk=True)
name: str
holder: 'EntityHolder' = Relationship(entity_type='EntityHolder')
class EntityHolder(Entity):
name: str
entity: SomeEntity = KeyNested(
related_entity_field=SomeEntity.id,
origin='entity_id',
back_relation=True,
)
storage = Storage()
entity = SomeEntity({'id': 123, 'name': 'entity'}, storage=storage)
holder = EntityHolder({'name': 'holder', 'entity_id': 123}, storage=storage)
assert holder.entity == entity
assert entity.holder == holder
Change relationships between entities
As with Nested
it is possible to change related data
from corm import Relationship, Entity, Field, KeyNested, Storage
class SomeEntity(Entity):
id: int = Field(pk=True)
name: str
holder: 'EntityHolder' = Relationship(entity_type='EntityHolder')
class EntityHolder(Entity):
entity: SomeEntity = KeyNested(
related_entity_field=SomeEntity.id,
origin='entity_id',
back_relation=True,
)
storage = Storage()
entity1 = SomeEntity({'id': 123, 'name': 'entity1'}, storage=storage)
entity2 = SomeEntity({'id': 321, 'name': 'entity2'}, storage=storage)
holder = EntityHolder(
data={'entity_id': 123},
storage=storage,
)
holder.entity = entity2
assert entity1.holder is None
assert entity2.holder is holder
assert holder.entity is entity2
assert holder.dict() == {'entity_id': 321}