flask_sqlalchemy relationship 子表排序

背景:

使用flask_sqlalchemy 的orm 时总不可避免的遇到子表排序问题

材料:

省略

制作:

直接看下面2段代码片段(一对多关系组合),自行理解:

1、多的一方实体

复制代码
from .exts import db
from flask_login import UserMixin
from datetime import datetime


class SchedulerLog(db.Model, UserMixin):
    __tablename__ = 'scheduler_log'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    created_at = db.Column(db.TIMESTAMP, default=datetime.utcnow)
    task_id = db.Column(db.Integer, db.ForeignKey('scheduler_task.id'))
    execute_type = db.Column(db.Integer)
    description = db.Column(db.String(228))
    result_status = db.Column(db.Integer)
    task_info = db.Column(db.String(228))
    org_code = db.Column(db.String(228))

2、少的一方实体

复制代码
from .exts import db
from flask_login import UserMixin
from datetime import datetime


class SchedulerTask(db.Model, UserMixin):
    __tablename__ = 'scheduler_task'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    created_at = db.Column(db.TIMESTAMP, default=datetime.utcnow)
    updated_at = db.Column(db.TIMESTAMP, default=datetime.utcnow)
    description = db.Column(db.String(228))
    task_name = db.Column(db.String(228))
    task_code = db.Column(db.String(228))
    status = db.Column(db.Integer)
    exe_status = db.Column(db.Integer)
    job_id = db.Column(db.Integer())
    task_type = db.Column(db.Integer())
    org_code = db.Column(db.String(228))
    tasklogs = db.relationship('SchedulerLog', backref='scheduler_task', order_by='SchedulerLog.id.desc()', lazy='dynamic')

3、relationship 关系函数下自带order_by排序方法,直接按照实体进行映射,但要记住 desc()/asc() 后面一定要有(),否则会报错(本人被坑了2个小时) ,order_by的源码如下:

复制代码
def relationship(
    argument: Optional[_RelationshipArgumentType[Any]] = None,
    secondary: Optional[_RelationshipSecondaryArgument] = None,
    *,
    uselist: Optional[bool] = None,
    collection_class: Optional[
        Union[Type[Collection[Any]], Callable[[], Collection[Any]]]
    ] = None,
    primaryjoin: Optional[_RelationshipJoinConditionArgument] = None,
    secondaryjoin: Optional[_RelationshipJoinConditionArgument] = None,
    back_populates: Optional[str] = None,
    order_by: _ORMOrderByArgument = False,
    backref: Optional[ORMBackrefArgument] = None,
    overlaps: Optional[str] = None,
    post_update: bool = False,
    cascade: str = "save-update, merge",
    viewonly: bool = False,
    init: Union[_NoArg, bool] = _NoArg.NO_ARG,
    repr: Union[_NoArg, bool] = _NoArg.NO_ARG,  # noqa: A002
    default: Union[_NoArg, _T] = _NoArg.NO_ARG,
    default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
    compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
    kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
    hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG,  # noqa: A002
    lazy: _LazyLoadArgumentType = "select",
    passive_deletes: Union[Literal["all"], bool] = False,
    passive_updates: bool = True,
    active_history: bool = False,
    enable_typechecks: bool = True,
    foreign_keys: Optional[_ORMColCollectionArgument] = None,
    remote_side: Optional[_ORMColCollectionArgument] = None,
    join_depth: Optional[int] = None,
    comparator_factory: Optional[
        Type[RelationshipProperty.Comparator[Any]]
    ] = None,
    single_parent: bool = False,
    innerjoin: bool = False,
    distinct_target_key: Optional[bool] = None,
    load_on_pending: bool = False,
    query_class: Optional[Type[Query[Any]]] = None,
    info: Optional[_InfoType] = None,
    omit_join: Literal[None, False] = None,
    sync_backref: Optional[bool] = None,
    **kw: Any,
相关推荐
毋语天1 小时前
FastAPI 进阶实战:请求体、文件上传、响应模型与数据校验
python·fastapi·api开发·数据校验·pydantic
IT_陈寒2 小时前
Vue的computed属性怎么突然不更新了?
前端·人工智能·后端
ZhengEnCi2 小时前
09a-斯坦福 CS336 作业一:BPE 分词器
python·神经网络
测试员周周2 小时前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例
invicinble2 小时前
spring提供的其他机制
java·后端·spring
还是鼠鼠2 小时前
AI掘金头条新闻系统 (Toutiao News)-用户注册-创建用户
后端·python·mysql·fastapi·web
灰灰勇闯IT3 小时前
DeepSeek-R1 在 CANN 上的推理部署
pytorch·python·深度学习
李广坤3 小时前
别再把 Filter、Interceptor 和 AOP 混为一谈了!从接口加解密谈 Spring 纵深架构设计
后端
我是一颗柠檬3 小时前
【MySQL全面教学】MySQL条件查询与排序Day4(2026年)
数据库·后端·mysql
她的男孩3 小时前
后台权限不只是菜单隐藏:Forge Admin 的 RBAC 权限链路拆解
java·后端·架构