如何在Flask中使用SQLALCHEMY对辅助表进行分页?

时间:2017-09-18 10:45:10

标签: flask flask-sqlalchemy

我正在尝试为客户端分页辅助表,但它不起作用,结果总是超过 per_page 参数,默认情况下每个参数只显示三个项目页面。

这是我的 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, UserMixin):
    id = db.Column(db.Integer(), primary_key=True)
    public_id = db.Column(db.String(50), default=uuid.uuid4)
    name = db.Column(db.String())
    subscribed_users = db.relationship(
        'User',
        secondary=subscribers,
        backref=db.backref('user', passive_deletes=True, lazy='dynamic')
    )

这也是我的 views.py

from flask import current_app

current_app.config['SUBSCRIBERS_PER_PAGE'] = 3

@api_route.route('/client/subscribers/<string:category>/<string:client_id>', methods=['GET'])
@token_required
def subscribers(current_user, category, client_id):
    if request.method == 'GET':

        page = request.args.get('page', 1, type=int)
        client = Client.query.filter_by(public_id=client_id).first()

        if not client:
            raise InvalidUsage(u'404, not found!', status_code=404)

        pagination = # Paginate Client.subscribed_users

        psubscribers = pagination.items
        subscribers = {}

        prev = None
        if pagination.has_prev:
            prev = url_for('api.subscribers', category=category, client_id=client_id, page=page-1, _external=True)

        next = None
        if pagination.has_next:
            next = url_for('api.subscribers', category=category, client_id=client_id, page=page+1, _external=True)

        for client in client.subscribed_users:
            subscribers_case = {
                'id': client.id,
                'public_id': client.public_id,
                'image': '/static/img/'+client.image if client.image else '/static/img/logo.png',
                'name': client.name,
            }
            subscribers[client.public_id] = subscribers_case

        return jsonify({
            'subscribers' : subscribers,
            'prev' : prev,
            'next': next,
            'count' : pagination.total
        })
    return jsonify({'error' : 'No data!'})

此处还有模型中的类用户

class User(db.Model, UserMixin):
    __tablename__ = 'user'
    id = db.Column(db.Integer(), primary_key=True)
    public_id = db.Column(db.String(50), default=uuid.uuid4)
    name = db.Column(db.String())
    family = db.Column(db.String())
    bio = db.Column(db.String())
    tele = db.Column(db.String(), unique=True)
    password = db.Column(db.String())
    clients = db.relationship('Client', backref='user', passive_deletes=True, lazy='dynamic')
    news = db.relationship('News', backref='user', passive_deletes=True, lazy='dynamic')
    notifications = db.relationship('Notification', backref='user', passive_deletes=True, lazy='dynamic')
    image = db.Column(db.String(), nullable=True)
    slug = db.Column(db.String())
    roles = db.relationship(
        'Role',
        secondary=roles,
        backref=db.backref('users', lazy='joined',
        passive_deletes=True,
        single_parent=True)
    )
    subscribed_clients = db.relationship(
        'Client',
        secondary=subscribers,
        backref=db.backref('client', passive_deletes=True, lazy='joined')
    )

任何建议人员如何做到这一点!!!

0 个答案:

没有答案