From 48ddf6b3cc3fbf5c32fd2c5eeb376e204f563ed8 Mon Sep 17 00:00:00 2001 From: martsforever Date: Fri, 22 Aug 2025 20:49:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=B3=E8=81=94=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=87=BA=E6=9D=A5=E7=88=B6=E7=BB=84=E7=BB=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/model/OrgModel.py | 42 +++++++++++++++++++++++++++--- app/utils/create_module_service.py | 7 ++++- 2 files changed, 45 insertions(+), 4 deletions(-) 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) # 若有过滤条件,验证并应用过滤