先看原始碼:
@app.route('/movie', methods=['GET', 'POST']) @app.route('/home', methods=['GET', 'POST']) @app.route('/index', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST']) def movie_page(): # user = User.query.first() if request.method == 'POST': # 判斷是否是 POST 請求 if not current_user.is_authenticated: # 如果當前使用者未認證 flash('未登入無法新增.') return redirect(url_for('login')) # 重定向到主頁 # 獲取表單資料 title = request.form.get('title') # 傳入表單對應輸入欄位的 name 值 title = "%s" % escape(title) year = request.form.get('year') year = "%s" % escape(year) # 驗證資料 if not title or not year or len(year) != 4 or len(title) > 60: flash('Invalid input.') # 顯示錯誤提示 return redirect(url_for('movie_page')) # 重定向回主頁 # 儲存表單資料到資料庫 movie = Movie(title=title, year=year) # 建立記錄 db.session.add(movie) # 新增到資料庫會話 db.session.commit() # 提交資料庫會話 flash('Item created.') # 顯示成功建立的提示 return redirect(url_for('movie_page')) # 重定向回主頁 movies = Movie.query.order_by(db.desc(Movie.id)).all() data = request.args.to_dict() page = int(data.get('page', 1)) res = Movie.query.order_by(db.desc(Movie.id)).paginate(page, POSTS_PER_AGE) return render_template('index.html', res=res, movies=movies)
flask-sqlalchemy獲取分頁資料
在flask-sqlalchemy操作的資料模型的過程中,使用paginate()
方法將結果返回為一個翻頁物件,不同於all()
,first()
可以直接獲得資料,paginate返回的結果是一個物件,paginate接收三個引數,第一個是從第幾頁開始(從1開始
),預設是第一頁,第二個引數是每頁多少條資料,預設是20
,第三個引數處理頁數越界
,預設為True
,如果是True則頁數小於等於0或者大於最大頁數都會報404錯誤,如果設定為False,頁數小於等於0會跳回第一頁,頁數大於最大值會返回空列表,paginate物件有以下方法
items
: 獲取這一頁的資料,返回一個列表,每個元素是各欄位資料組成的元組has_next
:是否有下一頁,True/Falsehas_prev
:是否有上一頁,True/Falsetotal
:總資料條數,intpage
:當前頁碼數,intpages
:總頁碼數,intnext_num
:下一頁頁碼,intprev_num
:上一頁頁碼,intnext()
:下一頁的翻頁物件,可以繼續呼叫物件的其他方法和屬性prev()
:上一頁的翻頁物件,可以繼續呼叫物件的其他方法和屬性
資料庫資料:
>>> from watchlist.models import User, Movie >>> from watchlist import app, db >>> res.items [<Movie 12>, <Movie 11>, <Movie 10>, <Movie 9>, <Movie 8>] >>> res = Movie.query.order_by(db.desc(Movie.id)).paginate(1, 10) >>> res.items [<Movie 31>, <Movie 30>, <Movie 29>, <Movie 28>, <Movie 27>, <Movie 26>, <Movie 25>, <Movie 24>, <Movie 23>, <Movie 22>] >>> res.items[0] <Movie 31> >>> res.items[0].title '速度與激情10' >>> res.items[0].year '2022' >>> res.has_next True >>> res.has_prev False >>> res.total 31 >>> res.page 1 >>> res.pages 4 >>> res.next_num 2 >>> res.prev_num>>> res.next().items [<Movie 21>, <Movie 20>, <Movie 19>, <Movie 18>, <Movie 17>, <Movie 16>, <Movie 15>, <Movie 14>, <Movie 13>, <Movie 12>] >>> res.next().next().items [<Movie 11>, <Movie 10>, <Movie 9>, <Movie 8>, <Movie 7>, <Movie 6>, <Movie 5>, <Movie 4>, <Movie 3>, <Movie 2>] >>>