Python 如何为DateTime比较定义Flask SQLAlchemy(MySQL)混合属性或聚合属性

Python 如何为DateTime比较定义Flask SQLAlchemy(MySQL)混合属性或聚合属性,python,mysql,flask,sqlalchemy,flask-sqlalchemy,Python,Mysql,Flask,Sqlalchemy,Flask Sqlalchemy,例如,数据库中有任务(父对象)和研究对象(子对象)。研究对象具有“开始时间”和“完成时间”属性。如何为任务对象定义两个混合属性。一个用于其任务中最早的开始时间,另一个用于其任务中最晚的完成时间 在文档中,它说聚合属性或混合属性可用于定义那些最早/最新的属性,但我无法管理如何比较sa.DateTime对象以及如何为这些对象编写sql查询 from flask_sqlalchemy import SQLAlchemy from sqlalchemy.ext.hybrid import hybrid_

例如,数据库中有任务(父对象)和研究对象(子对象)。研究对象具有“开始时间”和“完成时间”属性。如何为任务对象定义两个混合属性。一个用于其任务中最早的开始时间,另一个用于其任务中最晚的完成时间

在文档中,它说聚合属性或混合属性可用于定义那些最早/最新的属性,但我无法管理如何比较sa.DateTime对象以及如何为这些对象编写sql查询

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.sql import func as safunc

sa=SQLAlchemy()


class Task(sa.Model):
    __tablename__ = "tasks"
    id = sa.Column(sa.Integer, primary_key=True)
    studies = sa.relationship("Study", backref="task", cascade="all, delete, delete-orphan")

    @hybrid_propery
    def start(self):
        # ???

    @start.expression
    def start(cls):
        # ???

    @hybrid_propery
    def last_progress(self):
        # ???

    @last_progress.expression
    def last_progress(cls):
        # ???


class Study(sa.Model):
    __tablename__ = "studies"
    id = sa.Column(sa.Integer, primary_key=True)
    task_id = sa.Column(sa.Integer, sa.ForeignKey("tasks.id"))
    start = sa.Column(sa.DateTime, server_default=safunc.now())
    finish = sa.Column(sa.DateTime, nullable=True)
我处理好了 在混合属性中使用python min/max方法,在属性表达式中使用sqlalchemy.sql.func中的min/max funcs,代码运行良好

task=task.query.filter\u by(id=id.first()

task.start
query返回最早的研究开始记录和
task.last\u progress
返回我所查找的该任务的最新研究完成时间

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.sql import func as safunc

sa=SQLAlchemy()


class Task(sa.Model):
    __tablename__ = "tasks"
    id = sa.Column(sa.Integer, primary_key=True)
    studies = sa.relationship("Study", backref="task", cascade="all, delete, delete-orphan")

    @hybrid_propery
    def start(self):
        if any(i.start for i in self.studies):
            return min(filter(lambda x: x, [i.start for i in self.studies]))
        else:
            return None

    @start.expression
    def start(cls):
        return select([safunc.min(Study.start)]).\
                where(Study.task_id==cls.id).\
                label("start")

    @hybrid_propery
    def last_progress(self):
        if any(i.finish for i in self.studies):
            return max(filter(lambda x: x, [i.finish for i in self.studies]))
        else:
            return None

    @last_progress.expression
    def last_progress(cls):
        return select([safunc.max(Study.finish)]).\
                where(Study.task_id==cls.id).\
                label("last_progress")


class Study(sa.Model):
    __tablename__ = "studies"
    id = sa.Column(sa.Integer, primary_key=True)
    task_id = sa.Column(sa.Integer, sa.ForeignKey("tasks.id"))
    start = sa.Column(sa.DateTime, server_default=safunc.now())
    finish = sa.Column(sa.DateTime, nullable=True)