diff --git a/app/model/OrgModel.py b/app/model/OrgModel.py index 76fbb1e..01f6c0d 100644 --- a/app/model/OrgModel.py +++ b/app/model/OrgModel.py @@ -1,4 +1,8 @@ -from sqlmodel import Field +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 @@ -9,8 +13,40 @@ class OrgModel(BasicModel, table=True): name: str = Field(default=None, description="组织名称") code: str = Field(default=None, description="组织编码") - parent_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 + ) -OrgService = create_model_service(OrgModel) + 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]: + return self.parent.name if self.parent else None + + +OrgService = create_model_service( + Cls=OrgModel, + custom_query=lambda: select(OrgModel).options(selectinload(OrgModel.parent)), +) diff --git a/app/utils/create_module_service.py b/app/utils/create_module_service.py index 6fe543c..7d30c86 100644 --- a/app/utils/create_module_service.py +++ b/app/utils/create_module_service.py @@ -17,6 +17,8 @@ def create_model_service( #/*@formatter:off*/ Cls: Type[BasicModel], # model实体类 + custom_query = None, + before_query_list=None, # 分页查询前异步处理函数,参数:(query_param, session) after_query_list=None, # 分页查询后异步处理函数,参数:(query_cls_list, has_next, query_param, session) before_query_item=None, # 单条查询前异步处理函数,参数:(row_dict, session) @@ -184,7 +186,10 @@ def create_model_service( await before_query_list(query_param, session) # 创建基础查询:查询当前模型类的所有记录 - query = select(Cls) + if custom_query is not None: + query = custom_query() + else: + query = select(Cls) count_query = select(func.count()).select_from(Cls) # 若有过滤条件,验证并应用过滤