Source code for loom.core.model.relation
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, cast
from loom.core.model.enums import Cardinality, OnDelete, OnUpdate
[docs]
@dataclass(frozen=True, slots=True)
class Relation:
"""Relationship metadata assigned as a class attribute on a ``BaseModel``."""
foreign_key: str
cardinality: Cardinality
secondary: str | None = None
back_populates: str | None = None
on_delete: OnDelete | None = None
on_update: OnUpdate | None = None
profiles: tuple[str, ...] = ("default",)
depends_on: tuple[str, ...] = ()
default: Any = field(default=None)
[docs]
def RelationField(
*,
foreign_key: str,
cardinality: Cardinality,
secondary: str | None = None,
back_populates: str | None = None,
on_delete: OnDelete | None = None,
on_update: OnUpdate | None = None,
profiles: tuple[str, ...] = ("default",),
depends_on: tuple[str, ...] = (),
default: Any = None,
) -> Any:
"""Declare a relation field with normal typing (without assignment type errors)."""
return cast(
Any,
Relation(
foreign_key=foreign_key,
cardinality=cardinality,
secondary=secondary,
back_populates=back_populates,
on_delete=on_delete,
on_update=on_update,
profiles=profiles,
depends_on=depends_on,
default=default,
),
)
relation_field = RelationField