ER 图 API
base_entity
创建一个自动从子类收集 __relationships__ 的基类。调用 BaseEntity.get_diagram() 获取结果 ErDiagram。
BaseEntity = base_entity()
class UserEntity(BaseModel, BaseEntity):
id: int
name: str
class TaskEntity(BaseModel, BaseEntity):
__relationships__ = [
Relationship(fk='owner_id', target=UserEntity, name='owner', loader=user_loader)
]
id: int
owner_id: int
diagram = BaseEntity.get_diagram()
Relationship
from pydantic_resolve import Relationship
Relationship(
fk: str,
target: Any,
name: str,
loader: Callable | None = None,
fk_fn: Callable | None = None,
fk_none_default: Any | None = None,
fk_none_default_factory: Callable | None = None,
load_many: bool = False,
load_many_fn: Callable | None = None,
)
| 参数 | 类型 | 描述 |
|---|---|---|
fk |
str |
实体上的外键字段名 |
target |
Any |
目标实体类(一对多关系使用 list[Entity]) |
name |
str |
必填。唯一的关系名称 |
loader |
Callable \| None |
DataLoader 函数 |
fk_fn |
Callable \| None |
在传递给 loader 之前转换 FK 值 |
fk_none_default |
Any \| None |
FK 为 None 时的默认值 |
fk_none_default_factory |
Callable \| None |
FK 为 None 时默认值的工厂函数 |
load_many |
bool |
FK 字段包含多个值 |
load_many_fn |
Callable \| None |
将 FK 字段转换为可迭代对象用于 load_many |
Entity
from pydantic_resolve import Entity
Entity(
kls: type[BaseModel],
relationships: list[Relationship] = [],
queries: list[QueryConfig] = [],
mutations: list[MutationConfig] = [],
)
| 参数 | 类型 | 描述 |
|---|---|---|
kls |
type[BaseModel] |
Pydantic 模型类 |
relationships |
list[Relationship] |
出站关系 |
queries |
list[QueryConfig] |
GraphQL 查询入口点 |
mutations |
list[MutationConfig] |
GraphQL 变更入口点 |
ErDiagram
from pydantic_resolve import ErDiagram
ErDiagram(
entities: list[Entity],
description: str | None = None,
)
| 参数 | 类型 | 描述 |
|---|---|---|
entities |
list[Entity] |
所有实体定义 |
description |
str \| None |
可选的图表描述 |
create_auto_load()
创建绑定到此图表的注解工厂。在 Annotated 类型提示中使用。
add_relationship()
将外部实体(例如来自 ORM)合并到图表中。返回新的 ErDiagram。
AutoLoad
通过 ERD 关系自动解析字段的注解。
class TaskView(TaskEntity):
owner: Annotated[Optional[UserEntity], AutoLoad()] = None
# 或使用显式关系名称:
items: Annotated[list[TaskEntity], AutoLoad(origin='tasks')] = []
| 参数 | 类型 | 描述 |
|---|---|---|
origin |
str \| None |
要查找的关系名称。默认为字段名。 |
QueryConfig
from pydantic_resolve import QueryConfig
QueryConfig(
method: Callable,
name: str | None = None,
description: str | None = None,
)
MutationConfig
from pydantic_resolve import MutationConfig
MutationConfig(
method: Callable,
name: str | None = None,
description: str | None = None,
)
@query 装饰器
必须作为方法装饰器用在 Pydantic 实体类内部,不能装饰独立函数。
from pydantic_resolve import query
class SprintEntity(BaseModel, BaseEntity):
id: int
name: str
@query
async def get_all(cls, limit: int = 20) -> list['SprintEntity']:
return await fetch_sprints(limit)
GraphQL 字段名会根据实体名和方法名自动生成。
如果需要覆盖其中的方法名部分,请使用 QueryConfig(name=...)。
@mutation 装饰器
必须作为方法装饰器用在 Pydantic 实体类内部,不能装饰独立函数。
from pydantic_resolve import mutation
class SprintEntity(BaseModel, BaseEntity):
id: int
name: str
@mutation
async def create(cls, name: str) -> 'SprintEntity':
return await db.create_sprint(name=name)
GraphQL 字段名会根据实体名和方法名自动生成。
如果需要覆盖其中的方法名部分,请使用 MutationConfig(name=...)。