Files

60 lines
1.9 KiB
Python

from typing import Optional
from pydantic import computed_field
from sqlalchemy.orm import selectinload
from sqlmodel import Field, Relationship, select
from app.model.BasicModel import BasicModel
from app.utils.create_module_service import create_model_service
class OrgModel(BasicModel, table=True):
__tablename__ = "pl_org"
name: str = Field(default=None, description="组织名称")
code: str = Field(default=None, description="组织编码")
# parent_code: str = Field(default=None, description="父组织编码")
remarks: str = Field(default=None, description="备注信息")
parent_code: str = Field(
default=None,
description="父组织编码",
foreign_key="pl_org.code", # 添加外键约束
nullable=True
)
parent: Optional["OrgModel"] = Relationship(
sa_relationship_kwargs={
# 指定外键字段
# "OrgModel.parent_code" 表示使用 OrgModel 类的 parent_code 字段作为外键
# 这个字段引用了另一个 OrgModel 实例(父组织)
"foreign_keys": "OrgModel.parent_code",
# remote_side: 指定关系的远程端(被引用的一侧)
# "OrgModel.code" 表示关系的另一端是 OrgModel 的 code 字段
# 这是自引用关系中被引用的字段
"remote_side": "OrgModel.code",
# 指定关系是否返回列表
# False 表示这是一个一对多关系中的"一"端,返回单个对象而不是列表
# 一个组织只有一个父组织,所以设为 False
"uselist": False
}
)
@computed_field
@property
def parent_name(self) -> Optional[str]:
try:
return self.parent.name if self.parent else None
except:
return None
@parent_name.setter
def parent_name(self, value: Optional[str]) -> None:
pass
OrgService = create_model_service(
Cls=OrgModel,
custom_query=lambda: select(OrgModel).options(selectinload(OrgModel.parent)),
)