按多对多关系的计数排序SQLAlchemy

2024-04-25 22:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Flask SQLAlchemy来查询我的Postgres数据库。在

我正在尝试使用以下查询查询标题建议:

res = Title.query.filter(Titles.name.ilike(searchstring)).limit(20)

到目前为止还不错。在

现在我想按每个Title对象拥有的“订阅者”数量来排序结果。在

我知道下面的问题:SQLAlchemy ordering by count on a many to many relationship但是它的解决方案对我来说不起作用。在

我收到以下错误:

^{pr2}$

(Publisher与标题模型有一对多关系)

我知道答案与子查询有关

下面是我的两个模型的简化示例。在

# Many-to-Many relationship for user and titles
titles_users = db.Table('titles_users',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('title_id', db.Integer, db.ForeignKey('titles.id'))
)

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    # ids
    id = db.Column(db.Integer, primary_key=True)
    # Attributes
    email = db.Column(db.String(255), unique=True)
    full_name = db.Column(db.String(255))

    pull_list = db.relationship(
        'Title',
        secondary=titles_users,
        backref=db.backref('users', lazy='dynamic'),
        lazy='joined'
    )


class Title(db.Model):
    __tablename__ = 'titles'
    #: IDs
   id = db.Column(db.Integer(), primary_key=True)
   #: Attributes
   name = db.Column(db.String(255))

Tags: tonameidtrue标题dbstringsqlalchemy
1条回答
网友
1楼 · 发布于 2024-04-25 22:32:58

下面的代码适用于您描述的模型:

q = (db.session.query(Title, func.count(names_users.c.user_id).label("total"))
        .filter(Title.name.ilike(searchstring))
        .outerjoin(names_users).group_by(Title).order_by('total DESC')
    )
for x in q:
    print(x)

但是,您的错误包含一些其他数据,如publisher或类似的数据。所以,如果以上没有帮助,你应该在你的问题中添加更多的信息。在

相关问题 更多 >