pony.orm 按关系中的最新实体排序
pony.orm sort by newest Entity in relationship
假设我将这些表映射为 pony.orm
:
class Category(db.Entity):
threads = Set("Thread")
class Thread(db.Entity):
category = Required("Category")
posts = Set("Post")
class Post(db.Entity):
thread = Required("Thread")
timestamp = Required(datetime)
现在我想获取某个类别的所有线程,这些线程是最新的 post:
通过这一行,我得到了最新 post 的 ID,但我想要对象。
query = select((max(p.id), p.thread) for p in Post if p.thread.category.id == SOME_ID)
.order_by(lambda post_id, thread: -post_id)
当然可以[(Post[i], thread) for i, thread in query]
或select(p for p in Post if p.id in [i for i,_ in query])
但这会创建额外的 sql 语句。所以我的问题是:如何使用单个 sql 语句获取特定类别中所有线程的最新 posts 按 post 的时间戳排序。
如果你不能使用 ORM,我不会使用 db.execute(sql)
。
试试这个:
select((p, t) for t in Thread for p in t.posts
if p.id == max(p2.id for p2 in t.posts)
).order_by(lambda p, t: desc(p.id))
假设我将这些表映射为 pony.orm
:
class Category(db.Entity):
threads = Set("Thread")
class Thread(db.Entity):
category = Required("Category")
posts = Set("Post")
class Post(db.Entity):
thread = Required("Thread")
timestamp = Required(datetime)
现在我想获取某个类别的所有线程,这些线程是最新的 post:
通过这一行,我得到了最新 post 的 ID,但我想要对象。
query = select((max(p.id), p.thread) for p in Post if p.thread.category.id == SOME_ID)
.order_by(lambda post_id, thread: -post_id)
当然可以[(Post[i], thread) for i, thread in query]
或select(p for p in Post if p.id in [i for i,_ in query])
但这会创建额外的 sql 语句。所以我的问题是:如何使用单个 sql 语句获取特定类别中所有线程的最新 posts 按 post 的时间戳排序。
如果你不能使用 ORM,我不会使用 db.execute(sql)
。
试试这个:
select((p, t) for t in Thread for p in t.posts
if p.id == max(p2.id for p2 in t.posts)
).order_by(lambda p, t: desc(p.id))