美文网首页
sqlalchemy分页

sqlalchemy分页

作者: 真是明明 | 来源:发表于2018-06-08 08:19 被阅读73次
    
    
    from sqlalchemy.orm import  Query
    
    class Pagination(object):
        """
        分页对象
        """
        def __init__(self, query, page, per_page, total, items):
            self.query = query
            self.page = page
            self.per_page = per_page
            self.total = total
            self.items = items
    
        @property
        def pages(self):
            if self.per_page == 0:
                pages = 0
            else:
                pages = int(ceil(self.total / float(self.per_page)))
            return pages
    
        def prev(self, error_out=False):
            assert self.query is not None, 'a query object is required ' \
                                           'for this method to work'
            return self.query.paginate(self.page - 1, self.per_page, error_out)
    
        @property
        def prev_num(self):
            if not self.has_prev:
                return None
            return self.page - 1
    
        @property
        def has_prev(self):
            return self.page > 1
    
        def next(self, error_out=False):
            assert self.query is not None, 'a query object is required ' \
                                           'for this method to work'
            return self.query.paginate(self.page + 1, self.per_page, error_out)
    
        @property
        def has_next(self):
            return self.page < self.pages
    
        @property
        def next_num(self):
            if not self.has_next:
                return None
            return self.page + 1
    
        def iter_pages(self, left_edge=2, left_current=2,
                       right_current=5, right_edge=2):
            last = 0
            for num in xrange(1, self.pages + 1):
                if num <= left_edge or \
                   (num > self.page - left_current - 1 and \
                    num < self.page + right_current) or \
                   num > self.pages - right_edge:
                    if last + 1 != num:
                        yield None
                    yield num
                    last = num
    
    
    def paginate(self, page=None, per_page=None, error_out=True):
        """
        分页函数
        :param self:
        :param page:
        :param per_page:
        :param error_out:
        :return:
        """
        if request:
            if page is None:
                try:
                    page = int(request.args.get('page', 1))
                except (TypeError, ValueError):
                    if error_out:
                        abort(404)
    
                    page = 1
    
            if per_page is None:
                try:
                    per_page = int(request.args.get('per_page', 20))
                except (TypeError, ValueError):
                    if error_out:
                        abort(404)
    
                    per_page = 20
        else:
            if page is None:
                page = 1
    
            if per_page is None:
                per_page = 20
    
        if error_out and page < 1:
            abort(404)
    
        items = self.limit(per_page).offset((page - 1) * per_page).all()
    
        if not items and page != 1 and error_out:
            abort(404)
    
        if page == 1 and len(items) < per_page:
            total = len(items)
        else:
            total = self.order_by(None).count()
    
        return Pagination(self, page, per_page, total, items)
    
    
    
    Query.paginate = paginate#在原查询类上加上分页方法
    
    
    

    这样就搞定了,上面的paginate方法和Pagination类是从flask-sqlalchemy中复制的,当然也可以通过这个方法为sqlalchemy定制其他的方法。

    原文:https://blog.csdn.net/guoqianqian5812/article/details/78860572

    相关文章

      网友评论

          本文标题:sqlalchemy分页

          本文链接:https://www.haomeiwen.com/subject/tslqhxtx.html