feat: 关联查询出来父组织信息
This commit is contained in:
+39
-3
@@ -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.model.BasicModel import BasicModel
|
||||||
from app.utils.create_module_service import create_model_service
|
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="组织名称")
|
name: str = Field(default=None, description="组织名称")
|
||||||
code: 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="备注信息")
|
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)),
|
||||||
|
)
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ def create_model_service(
|
|||||||
#/*@formatter:off*/
|
#/*@formatter:off*/
|
||||||
Cls: Type[BasicModel], # model实体类
|
Cls: Type[BasicModel], # model实体类
|
||||||
|
|
||||||
|
custom_query = None,
|
||||||
|
|
||||||
before_query_list=None, # 分页查询前异步处理函数,参数:(query_param, session)
|
before_query_list=None, # 分页查询前异步处理函数,参数:(query_param, session)
|
||||||
after_query_list=None, # 分页查询后异步处理函数,参数:(query_cls_list, has_next, query_param, session)
|
after_query_list=None, # 分页查询后异步处理函数,参数:(query_cls_list, has_next, query_param, session)
|
||||||
before_query_item=None, # 单条查询前异步处理函数,参数:(row_dict, session)
|
before_query_item=None, # 单条查询前异步处理函数,参数:(row_dict, session)
|
||||||
@@ -184,7 +186,10 @@ def create_model_service(
|
|||||||
await before_query_list(query_param, session)
|
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)
|
count_query = select(func.count()).select_from(Cls)
|
||||||
|
|
||||||
# 若有过滤条件,验证并应用过滤
|
# 若有过滤条件,验证并应用过滤
|
||||||
|
|||||||
Reference in New Issue
Block a user