为什么我在 Flask 中得到 'InstrumentedList' 对象没有属性 'paginate' filter_by?

swo*_*ish 2 flask flask-sqlalchemy

我想为客户端的 subscribed_users 分页,但我收到一条错误消息:

cl = Client.query.filter_by(family='John').first()
cl.subscribed_users.paginate()
Run Code Online (Sandbox Code Playgroud)

AttributeError: 'InstrumentedList' object has no attribute 'paginate'

这是我的models.py

subscribers = db.Table(
    'clients_subscribed',
    db.Column('client_id', db.Integer, db.ForeignKey('client.id', ondelete='CASCADE')),
    db.Column('user_id', db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'))
)

class Client(db.Model):
    subscribed_users = db.relationship(
        'User',
        secondary=subscribers,
        backref=db.backref('user', passive_deletes=True, lazy='dynamic')
    )
Run Code Online (Sandbox Code Playgroud)

met*_*irr 5

paginate()定义在BaseQuery哪个是Queryin的子类上sqlalchemy。当您对flask-sqlalchemy模型执行查询时,分页可用但subscribed_users不是flask-sqlalchemy模型,因此您不能对其调用分页,因为它没有。解决办法是改成db.Table一个类如下:

class Subscribers(db.Model):
    client_id = db.Column(db.Integer, db.ForeignKey('client.id'), primary_key=True))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True))

class Client(db.Model):
    subscribed_users = db.relationship(
        ...
        secondary=Subscribers,
        ...
Run Code Online (Sandbox Code Playgroud)