我有2个型号:
class Actor(db.Model):
...
edited_at = db.Column(db.DateTime)
class Publication(db.Model):
...
published_at = db.Column(db.DateTime, default=datetime.now)
actor_id = db.Column(db.Integer, db.ForeignKey('actor.id'))
我需要通过actor.edited_at或publication.published_at字段(最新日期优先)来订购actor。不确定我是否可以在SQLAlchemy中实现这一点,或者我需要使用原始SQL(原始SQL查询也是一个解决方案,顺便说一句)。
我现在拥有的:
(db.session.query(models.Actor, func.max(models.Publication.published_at).label('latest')).join(models.Publication).group_by(models.Actor).order_by('latest desc', Actor.edited_at.desc())).all()
答案 0 :(得分:1)
您可以使用CASE expression来选择要订购的内容,但这并不是特别符合索引的:
from sqlalchemy import case
latest = func.max(models.Publication.published_at)
db.session.query(
models.Actor,
latest.label('latest')).\
join(models.Publication).\
group_by(models.Actor).\
order_by(case(
[(latest > models.Actor.edited_at, latest)],
else_=models.Actor.edited_at).desc()).\
all()
或者您可以使用GREATEST()
:
order_by(func.greatest(latest, models.Actor.edited_at).desc())