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