按OneToMany关系计数排序

1 投票
1 回答
1441 浏览
提问于 2025-04-17 05:20

我正在使用Elixir来处理对象关系映射(ORM),但在按关系排序时遇到了问题。

我想做的是获取一个用户列表,并按照他们发布的帖子数量进行排序。我尝试过一些方法,比如

User.query.join(User.posts).order_by(func.count(User.posts)).all()

但都没有成功。

以下是我的Elixir实体:

class User(Entity):
    username = Field(Unicode(100))
    posts = OneToMany('Post', inverse='user')


class Post(Entity):
    content = Field(Unicode(20000))
    user = ManyToOne('User')

1 个回答

5

这是一个常见的问题,关于这个问题的一个示例查询可以在ORM教程中找到,链接是:http://www.sqlalchemy.org/docs/orm/tutorial.html#using-subqueries。只需把里面的order_by(User.id)改成order_by(stmt.c.address_count)就可以了:

>>> from sqlalchemy.sql import func
>>> stmt = session.query(Address.user_id, func.count('*').\
...         label('address_count')).\
...         group_by(Address.user_id).subquery()

>>> for u, count in session.query(User, stmt.c.address_count).\
...     outerjoin(stmt, User.id==stmt.c.user_id).order_by(stmt.c.address_count): 
...     print u, count

撰写回答