1分頁(yè)
篩選
offset()
limit()
order_by()
get()
first()
paginate()
跳轉(zhuǎn)->在html中的應(yīng)用
方法一:
<a href="{{ url_for('users.update_stu'}}">跳轉(zhuǎn)</a>
后端函數(shù):
@uesrs_blue.route('/create_ref/')
def create_ref():
方法二:
<a href="{{ url_for('users.update_stu', id=stu.id) }}">修改</a>
后端函數(shù):
@uesrs_blue.route('/update_stu/<int:id>',methods=['GET','POST'])
def update_stu(id):
方法三:
<a href="{{ url_for('users.paginate') }}?page={{paginate.prev_num}}">上一頁(yè)</a>
后端函數(shù):
@uesrs_blue.route('/paginate/')
def paginate():
獲取分頁(yè)的當(dāng)前頁(yè)
page=int(request.args.get('page',1))
例子:
跳過(guò)offset幾個(gè)信息酣难,截取limit結(jié)果的幾個(gè)值
按照id降序排列
stus = Student.query.order_by('-s_id')
按照id升序排列
stus = Student.query.order_by('s_id')
stus = Student.query.order_by(asc('s_id'))
stus = Student.query.order_by('s_id asc')
按照id降序獲取三個(gè)
stus = Student.query.order_by('-s_id').limit(3)
stus = Student.query.order_by('s_id desc').limit(3)
from sqlalchemy import desc
stus = Student.query.order_by(desc('s_id')).limit(3)
獲取年齡最大的一個(gè)
stus = Student.query.order_by('-s_age').first()
跳過(guò)3個(gè)數(shù)據(jù)貌夕,查詢5個(gè)信息
stus = Student.query.order_by('-s_age').offset(3).limit(5)
跳過(guò)3個(gè)數(shù)據(jù)
stus = Student.query.order_by('-s_age').offset(3)
獲取id等于24的學(xué)生
stus = Student.query.filter(Student.s_id==24)
stus = Student.query.get(24)
第一個(gè)參數(shù)是那一頁(yè),第二個(gè)參數(shù)是一頁(yè)的條數(shù),第三個(gè)參數(shù)是是否輸出錯(cuò)誤信息
students = Student.query.paginate(2, 4, False).items
1)手動(dòng)實(shí)現(xiàn)分頁(yè)翅阵,使用offset和limit
page=int(request.args.get('page',1))
stus = Students.query.offset((page-1)*3).limit(3)
2)使用切片[:]
page=int(request.args.get('page',1))
stus=Students.query.all()[(page-1)3:page3]
3)sql
page=int(request.args.get('page',1))
sql ='select * from students limit %s,%s'%((page-1)*3,3)
stus=db.session.execute(sql)
4)使用paginate
查詢第幾頁(yè)的數(shù)據(jù)
page = int(request.args.get('page', 1))
每一頁(yè)的條數(shù)多少,默認(rèn)為10條
per_page = int(request.args.get('per_page', 10))
查詢當(dāng)前第幾個(gè)的多少條數(shù)據(jù)
paginate = Student.query.order_by('-s_id').paginate(page, per_page, error_out=False)
stus = paginate.items
后端代碼:
@uesrs_blue.route('/paginate/')
def paginate():
# 獲取分頁(yè)的當(dāng)前頁(yè)
page=int(request.args.get('page',1))
# 1.offset+limit
stus = Students.query.offset((page-1)*3).limit(3)
# 2.切片
stus=Students.query.all()[(page-1)*3:page*3]
# 3.sql
sql ='select * from students limit %s,%s'%((page-1)*3,3)
stus=db.session.execute(sql)
# 4.paginate()方法
paginate=Students.query.paginate(page,3)
stus=paginate.items
return render_template('page_students.html', stus=stus,paginate=paginate)
前端代碼:
{% extends 'base_main.html' %}
{% block title %}
查詢學(xué)生
{% endblock %}
{% block content %}
<table>
<thead>
<th>序號(hào)</th>
<th>id</th>
<th>姓名</th>
<th>年齡</th>
<th>操作</th>
</thead>
<tbody>
{% for stu in stus %}
<tr>
<td>{{loop.index0}}</td>
<td>{{stu.id}}</td>
<td>{{stu.s_name}}</td>
<td>{{stu.s_age}}</td>
<td><a >修改</a>|<a >刪除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<p>
<span>當(dāng)前{{paginate.page}}頁(yè),</span>
<span>共有{{paginate.pages}}頁(yè)</span>
</p>
<p>
<span>
{% if paginate.has_prev %}
<a href="{{ url_for('users.paginate') }}?page={{paginate.prev_num}}">上一頁(yè)</a>
{% else %}
第一頁(yè)
{% endif %}
{% for i in paginate.iter_pages() %}
<a href="{{ url_for('users.paginate') }}?page={{i}}">{{i}}</a>
{% endfor %}
{% if paginate.has_next %}
<a href="{{ url_for('users.paginate') }}?page={{paginate.next_num}}">下一頁(yè)</a>
{% else %}
最后一頁(yè)
{% endif %}
</span>
</p>
{% endblock %}
2. 關(guān)聯(lián)關(guān)系
2.1 一對(duì)多建立模型
學(xué)生模型:
class Student(db.Model):
s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=True)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.g_id'), nullable=True)
__tablename__ = 'student'
班級(jí)模型:
class Grade(db.Model):
g_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
g_name = db.Column(db.String(10), unique=True)
g_desc = db.Column(db.String(100), nullable=True)
g_time = db.Column(db.Date, default=datetime.now)
students = db.relationship('Student', backref='stu', lazy=True)
__tablename__ = 'grade'
官網(wǎng)解釋有如下幾個(gè)lazy的參數(shù):
lazy 決定了 SQLAlchemy 什么時(shí)候從數(shù)據(jù)庫(kù)中加載數(shù)據(jù):,有如下四個(gè)值:
select/True: (which is the default) means that SQLAlchemy will load the data as necessary in one go using a standard select statement.
joined/False: tells SQLAlchemy to load the relationship in the same query as the parent using a JOIN statement.
subquery: works like ‘joined’ but instead SQLAlchemy will use a subquery.
dynamic: is special and useful if you have many items. Instead of loading the items SQLAlchemy will return another query object which you can further refine before loading the items. This is usually what you want if you expect more than a handful of items for this relationship
select就是訪問(wèn)到屬性的時(shí)候待笑,就會(huì)全部加載該屬性的數(shù)據(jù)。
joined則是在對(duì)關(guān)聯(lián)的兩個(gè)表進(jìn)行join操作抓谴,從而獲取到所有相關(guān)的對(duì)象暮蹂。
dynamic則不一樣,在訪問(wèn)屬性的時(shí)候癌压,并沒(méi)有在內(nèi)存中加載數(shù)據(jù)仰泻,而是返回一個(gè)query對(duì)象, 需要執(zhí)行相應(yīng)方法才可以獲取對(duì)象,
代碼部署:
1.添加關(guān)系
@uesrs_blue.route('/create_ref/')
def create_ref():
# 方法一:
# 已知學(xué)生添加班級(jí)
stus_ids=[8,9]
for id in stus_ids:
stu=Students.query.get(id)
# 在flask中stu.s_g獲取的值為int類型
# 在Django中stu.s_g獲取的值是對(duì)象滩届,stu.s_g_id獲取到的是int類型
stu.s_g=7
stu.save()
# 方法二:
# 已知班級(jí)添加學(xué)生
# g=Grade.query.get(4)
# stu=Students.query.filter(Students.id==5).first()
# g.students.append(stu)
# stu.save()
return '添加成功'
-
通過(guò)班級(jí)查詢學(xué)生信息
@grade.route('/selectstubygrade/<int:id>/') def select_stu_by_grade(id): grade = Grade.query.get(id) # 通過(guò)班級(jí)對(duì)象.定義的relationship變量去獲取學(xué)生的信息 stus = grade.students return render_template('grade_student.html', stus=stus, grade=grade )
-
通過(guò)學(xué)生信息查詢班級(jí)信息
@stu.route('/selectgradebystu/<int:id>/') def select_grade_by_stu(id): stu = Student.query.get(id) # 通過(guò)學(xué)生對(duì)象.定義的backref參數(shù)去獲取班級(jí)的信息 grade = stu.stu return render_template('student_grade.html', grade=grade, stu=stu)
注意:表的外鍵由db.ForeignKey指定集侯,傳入的參數(shù)是表的字段。db.relations它聲明的屬性不作為表字段帜消,第一個(gè)參數(shù)是關(guān)聯(lián)類的名字棠枉,backref是一個(gè)反向身份的代理,相當(dāng)于在Student類中添加了stu的屬性。例如券犁,有Grade實(shí)例dept和Student實(shí)例stu。dept.students.count()將會(huì)返回學(xué)院學(xué)生人數(shù);stu.stu.first()將會(huì)返回學(xué)生的學(xué)院信息的Grade類實(shí)例汹碱。一般來(lái)講db.relationship()會(huì)放在一這一邊粘衬。
2.2. 關(guān)聯(lián)關(guān)系---多對(duì)多
定義模型:
引入SLALchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
創(chuàng)建中間表
sc = db.Table('sc',#表名
db.Column('s_id', db.Integer, db.ForeignKey('student.s_id'), primary_key=True),
db.Column('c_id', db.Integer, db.ForeignKey('courses.c_id'), primary_key=True)
)
創(chuàng)建學(xué)生類Student
class Student(db.Model):
s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=True)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.g_id'), nullable=True)
__tablename__ = 'student'
def __init__(self, name, age):
self.s_name = name
self.s_age = age
self.s_g = None
創(chuàng)建課程表的模型,Course類
class Course(db.Model):
c_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
c_name = db.Column(db.String(20), unique=True)
students = db.relationship('Student',#指定關(guān)聯(lián)表
#指定中間表
secondary=sc,
#反向解析
backref='cou')
__tablename__ = 'courses'
def __init__(self, name):
self.c_name = name
sc表由db.Table聲明咳促,我們不需要關(guān)心這張表稚新,因?yàn)檫@張表將會(huì)由SQLAlchemy接管,它唯一的作用是作為students表和courses表關(guān)聯(lián)表跪腹,所以必須在db.relationship()中指出sencondary關(guān)聯(lián)表參數(shù)褂删。lazy是指查詢時(shí)的惰性求值的方式,這里有詳細(xì)的參數(shù)說(shuō)明冲茸,而db.backref是聲明反向身份代理屯阀,其中的lazy參數(shù)是指明反向查詢的惰性求值方式.
2.2.1. 添加學(xué)生和課程之間的關(guān)系
通過(guò)頁(yè)面中傳遞學(xué)生的id和課程的id缅帘,分別獲取學(xué)生的對(duì)象和課程的對(duì)象,在使用關(guān)聯(lián)關(guān)系append去添加學(xué)生對(duì)象难衰,并且add以后再commit后钦无,就可以在中間表sc中查看到新增的關(guān)聯(lián)關(guān)系了。
userid = request.form.get('userid')
courseid = request.form.get('courseid')
stu = Student.query.get(userid)
cou = Course.query.get(courseid)
cou.students.append(stu)
db.session.add(cou)
db.session.commit()
2.2.2. 刪除學(xué)生和課程之間的關(guān)系
通過(guò)頁(yè)面獲取傳遞的學(xué)生的id和課程的id盖袭,分別獲取學(xué)生對(duì)象和課程對(duì)象失暂,在使用關(guān)聯(lián)關(guān)系remove去刪除學(xué)生對(duì)象,并commit將事務(wù)提交到數(shù)據(jù)庫(kù)中
stu = Student.query.get(s_id)
cou = Course.query.get(c_id)
cou.students.remove(stu)
db.session.commit()
2.2.3. 通過(guò)課程查詢學(xué)生的信息
以下定義在課程course的模型中鳄虱,所以通過(guò)課程查詢學(xué)生的信息弟塞,語(yǔ)法為課程的對(duì)象.studengs。如果知道學(xué)生的信息反過(guò)來(lái)找課程的信息拙已,則使用backref的反向關(guān)聯(lián)去查詢决记,語(yǔ)語(yǔ)法為學(xué)生的對(duì)象.cou(反向)
students = db.relationship('Student',secondary=sc,backref='cou')
cou = Course.query.get(2)
stus = cou.students
2.2.4. 通過(guò)學(xué)生去查詢課程的信息
stu = Student.query.get(id)
cous = stu.cou
3. 數(shù)據(jù)庫(kù)遷移
在django中繼承了makemigrations,可以通過(guò)migrate操作去更新數(shù)據(jù)庫(kù)悠栓,修改我們定義的models霉涨,然后在將模型映射到數(shù)據(jù)庫(kù)中。
在flask中也有migrate操作惭适,它能跟蹤模型的變化笙瑟,并將變化映射到數(shù)據(jù)庫(kù)中
3.1 安裝migrate
pip install flask-migrate
3.2 配置使用migrate
3.2.1 初始化,使用app和db進(jìn)行migrate對(duì)象的初始化
from flask_migrate import Migrate
#綁定app和數(shù)據(jù)庫(kù)
Migrate(app=app, db=db)
3.2.2 安裝了flask-script的話癞志,可以在Manager()對(duì)象上添加遷移指令
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
manage = Manager(app=app)
manage.add_command('db', MigrateCommand)
操作:
python manage.py db init 初始化出migrations的文件往枷,只調(diào)用一次
python manage.py db migrate 生成遷移文件
python manage.py db upgrade 執(zhí)行遷移文件中的升級(jí)
python manage.py db downgrade 執(zhí)行遷移文件中的降級(jí)
python manage.py db --help 幫助文檔
代碼區(qū):
manage.py
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
from flask_script import Manager
from flask_session import Session
from users.models import db
from users.views import uesrs_blue
app=Flask(__name__)
# 藍(lán)圖、設(shè)置前綴
app.register_blueprint(blueprint=uesrs_blue,url_prefix='/users')
# 設(shè)置秘鑰
app.config['SECRET_KEY']='secret_key'
# 數(shù)據(jù)庫(kù)設(shè)置
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/flask5'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
# 開(kāi)啟debug模式
app.debug=True
# 綁定數(shù)據(jù)庫(kù)
db.init_app(app)
# 初始化debugtoolbar和app
toolbar=DebugToolbarExtension()
toolbar.init_app(app)
# manager
manager=Manager(app=app)
if __name__=='__main__':
manager.run()
uers->views.py
from flask import Blueprint, render_template, request, redirect, url_for
from sqlalchemy import or_, not_
from users.models import Students, db, Grade, Course
uesrs_blue=Blueprint('users',__name__)
# @uesrs_blue.route('/register/',methods=['GET','POST'])
# def register():
# if request.method=='GET':
# return render_template('register.html')
# if request.method=='POST':
# pass
@uesrs_blue.route('/create_table/')
def create_table():
# 用于初次創(chuàng)建模型
db.create_all()
return "創(chuàng)建成功"
@uesrs_blue.route('/drop_table/')
def drop_table():
db.drop_all()
return "刪除成功"
@uesrs_blue.route('/add_students/',methods=['GET','POST'])
def add_students():
if request.method=='GET':
return render_template('students.html')
if request.method=='POST':
name=request.form.get('name')
age=int(request.form.get('age'))
# 單個(gè)創(chuàng)建
stu=Students()
stu.s_name=name
stu.s_age=age
stu.save()
return '添加學(xué)生成功'
@uesrs_blue.route('/add_grade/',methods=['GET','POST'])
def add_grade():
if request.method=='GET':
return render_template('grade.html')
if request.method=='POST':
name=request.form.get('grade_name')
# 單個(gè)創(chuàng)建
g=Grade()
g.g_name=name
g.save()
return '添加班級(jí)成功'
@uesrs_blue.route('/add_course/',methods=['GET','POST'])
def add_course():
# 批量添加
# courses=['java','python','css','javascript','數(shù)學(xué)']
# c_list=[]
# for course in courses:
# cou=Course()
# cou.c_name=course
# c_list.append(cou)
# # db.session.add(cou)
# # db.session.commit()
# db.session.add_all(c_list)
# db.session.commit()
# return '添加課程成功'
if request.method=='GET':
return render_template('course.html')
if request.method=='POST':
name=request.form.get('course_name')
# 單個(gè)創(chuàng)建
cou=Course()
cou.c_name=name
cou.save()
return '添加課程成功'
@uesrs_blue.route('/add_all_students/')
def add_all_students():
# 批量創(chuàng)建 add_all()
names=['小王','小圖','小坑','小進(jìn)','老金','小人','小建','小國(guó)','老劉']
stu_list=[]
for name in names:
stu=Students()
stu.s_name=name
stu_list.append(stu)
db.session.add_all(stu_list)
db.session.commit()
return '批量創(chuàng)建成功'
@uesrs_blue.route('/select_students/')
def select_students():
# 方法一:
stu=Students.query.filter(Students.s_name=='小王')
stu=Students.query.filter(Students.s_name=='小建').first()
# 方法二:
stu=Students.query.filter_by(s_name='老劉')
stu=Students.query.filter_by(s_name='老劉').first()
# 方法三:
stus=Students.query.all()
# 方法四:
sql='select * from students;'
stu=db.session.execute(sql)
# 模糊查詢
# select * from students where s_name like '%王%'
# select * from students where s_name like '王%'
# select * from students where s_name like '_王%' 第二位為王
# select * from students where s_name like '%王'
stu=Students.query.filter(Students.s_name.contains('小'))
stu=Students.query.filter(Students.s_name.startswith('小'))
stu=Students.query.filter(Students.s_name.endswith('王'))
# 查詢id在某個(gè)范圍之內(nèi)的學(xué)生信息
# select * from students where id in (2,3,4,5,6)
stu=Students.query.filter(Students.id.in_([2,3,4,5,6]))
# 運(yùn)算符查詢
# 查詢年齡大于19的學(xué)生信息
stu=Students.query.filter(Students.s_age>19)
stu=Students.query.filter(Students.s_age.__gt__(19))
# get方法凄杯,獲取主鍵對(duì)應(yīng)的行數(shù)據(jù)
stu=Students.query.get(2)
# offset+limit
stu=Students.query.limit(3)
stu=Students.query.offset(1).limit(3)
# 排序order_by
stu=Students.query.order_by('-id')
# 查詢姓名中包含王的错洁,并且年齡等于23
stu=Students.query.filter(Students.s_name.contains('王'),
Students.s_age==19)
# 查詢姓名中包含王的,或年齡等于23
# Django中:filter(Q(A)|Q(B))
# flask中:filter(or_(A,B))
stu=Students.query.filter(or_(Students.s_name.like('%王%'),
Students.s_age==19))
# 查詢姓名中不包含王的戒突,且年齡等于23
stu = Students.query.filter(not_(Students.s_name.like('%王%')),
Students.s_age == 19)
return render_template('select_students.html',stus=stus)
@uesrs_blue.route('/delete_stu/<int:id>')
def delete_stu(id):
stu=Students.query.filter(Students.id==id).first()
db.session.delete(stu)
db.session.commit()
return '刪除成功'
@uesrs_blue.route('/update_stu/<int:id>',methods=['GET','POST'])
def update_stu(id):
if request.method=='GET':
return render_template('update_stu.html')
if request.method=='POST':
name = request.form.get('name')
age = int(request.form.get('age'))
stu = Students.query.filter_by(id=id).first()
if name:
stu.s_name = name
if age:
stu.s_age = age
stu.save()
return redirect(url_for('users.select_students'))
@uesrs_blue.route('/paginate/')
def paginate():
# 獲取分頁(yè)的當(dāng)前頁(yè)
page=int(request.args.get('page',1))
# 1.offset+limit
stus = Students.query.offset((page-1)*3).limit(3)
# 2.切片
stus=Students.query.all()[(page-1)*3:page*3]
# 3.sql
sql ='select * from students limit %s,%s'%((page-1)*3,3)
stus=db.session.execute(sql)
# 4.paginate()方法
paginate=Students.query.paginate(page,3)
stus=paginate.items
return render_template('page_students.html', stus=stus,paginate=paginate)
@uesrs_blue.route('/create_ref/')
def create_ref():
# 方法一:
# 已知學(xué)生添加班級(jí)
stus_ids=[8,9]
for id in stus_ids:
stu=Students.query.get(id)
# 在flask中stu.s_g獲取的值為int類型
# 在Django中stu.s_g獲取的值是對(duì)象屯碴,stu.s_g_id獲取到的是int類型
stu.s_g=7
stu.save()
# 方法二:
# 已知班級(jí)添加學(xué)生
# g=Grade.query.get(4)
# stu=Students.query.filter(Students.id==5).first()
# g.students.append(stu)
# stu.save()
return '添加成功'
@uesrs_blue.route('/sel_sut_g/')
def sel_sut_g():
# 通過(guò)學(xué)生查看班級(jí)
stu=Students.query.filter(Students.s_name=='小建').first()
# stu=Students.query.get(4)
# g返回的是一個(gè)對(duì)象
g=stu.grade
return g.g_name
@uesrs_blue.route('/sel_g_sut/')
def sel_g_sut():
# 通過(guò)班級(jí)查看學(xué)生
g=Grade.query.get(6)
# stu返回的是一個(gè)列表,列表里是多個(gè)對(duì)象
# 一對(duì)多膊存,通過(guò)主鍵找外鍵返回的是一個(gè)列表导而,通過(guò)外鍵找主鍵返回的是對(duì)象
stu=g.students
return stu[0].s_name
@uesrs_blue.route('/add_stu_cou/')
def add_stu_cou():
# 方法一:
# 通過(guò)學(xué)生對(duì)象查找課程信息,stu.cou
# stu=Students.query.get(9)
# course_id=[3,7]
# for id in course_id:
# course=Course.query.get(id)
# stu.cou.append(course)
# stu.save()
# 方法二:
# 通過(guò)課程對(duì)象添加學(xué)生信息隔崎,g.students
# c=Course.query.get(1)
# 單個(gè)添加
# stu=Students.query.get(3)
# c.students.append(stu)
# 批量添加
# stu_id=[4,6]
# for id in stu_id:
# stu = Students.query.get(id)
# c.students.append(stu)
# c.save()
return '添加多對(duì)多關(guān)聯(lián)關(guān)系成功'
@uesrs_blue.route('/sel_c_stu/')
def sel_c_stu():
# 通過(guò)學(xué)生查詢課程
stu=Students.query.get(1)
c=stu.cou
return c[0].c_name
@uesrs_blue.route('/sel_stu_c/')
def sel_stu_c():
# 通過(guò)課程查詢學(xué)生
c=Course.query.filter(Course.c_name == 'python').first()
stu=c.students
return stu[0].s_name
users->models
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()
class Students(db.Model):
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
s_name=db.Column(db.String(10),unique=False,nullable=False)
s_age=db.Column(db.Integer,default=19)
s_g=db.Column(db.Integer,db.ForeignKey('grade.id'),nullable=True)
__tablename__='students'
def save(self):
db.session.add(self)
db.session.commit()
class Grade(db.Model):
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
g_name=db.Column(db.String(30),unique=True,nullable=False)
students=db.relationship('Students',backref='grade')
# 可以不寫(xiě)今艺,系統(tǒng)默認(rèn)表名為grade
__tablename__ = 'grade'
def save(self):
db.session.add(self)
db.session.commit()
# django中一對(duì)多,主鍵在多,多對(duì)多爵卒,主鍵隨意在那一方
# flask中一對(duì)多虚缎,主鍵在一,多對(duì)多,主鍵隨意在那一方
s_c=db.Table('s_c',
db.Column('s_id',db.Integer,db.ForeignKey('students.id'),primary_key=True),
db.Column('c_id',db.Integer,db.ForeignKey('course.id'),primary_key=True)
)
# 懶加載:lazy='dynamic'時(shí)钓株,course.students[0]返回的結(jié)果不是對(duì)象实牡,而是查詢語(yǔ)句陌僵,
# 通過(guò)course.students[0].all() 加過(guò)濾條件才能得到對(duì)象,lazy=其他時(shí)铲掐,course.students[0]返回的是對(duì)象
class Course(db.Model):
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
c_name=db.Column(db.String(10),unique=True,nullable=False)
students=db.relationship('Students',
secondary=s_c,
backref='cou',
# lazy='dynamic'
lazy=True)
__tablename__ = 'course'
def save(self):
db.session.add(self)
db.session.commit()
templates->base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
{% endblock %}
</title>
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
templates->base_main.html
{% extends 'base.html' %}
{% block js %}
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"type="text/javascript"></script>
{% endblock %}
templates->students.html
{% extends 'base_main.html' %}
{% block title %}
添加學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
姓名:<input type="text" name="name"><br>
年齡:<input type="text" name="age"><br>
<input type="submit" value="添加學(xué)生">
</form>
{% endblock %}
templates->select_students.html
{% extends 'base_main.html' %}
{% block title %}
查詢學(xué)生
{% endblock %}
{% block content %}
<table>
<thead>
<th>序號(hào)</th>
<th>id</th>
<th>姓名</th>
<th>年齡</th>
<th>操作</th>
</thead>
<tbody>
{% for stu in stus %}
<tr>
<td>{{loop.index0}}</td>
<td>{{stu.id}}</td>
<td>{{stu.s_name}}</td>
<td>{{stu.s_age}}</td>
<td><a >修改</a>|<a >刪除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
templates->update_students.html
{% extends 'base_main.html' %}
{% block title %}
修改學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
姓名:<input type="text" name="name"><br>
年齡:<input type="text" name="age"><br>
<input type="submit" value="修改學(xué)生信息">
</form>
{% endblock %}
templates->page_students.html
{% extends 'base_main.html' %}
{% block title %}
查詢學(xué)生
{% endblock %}
{% block content %}
<table>
<thead>
<th>序號(hào)</th>
<th>id</th>
<th>姓名</th>
<th>年齡</th>
<th>操作</th>
</thead>
<tbody>
{% for stu in stus %}
<tr>
<td>{{loop.index0}}</td>
<td>{{stu.id}}</td>
<td>{{stu.s_name}}</td>
<td>{{stu.s_age}}</td>
<td><a href="{{ url_for('users.update_stu', id=stu.id) }}">修改</a>|<a href="{{ url_for('users.delete_stu', id=stu.id) }}">刪除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<p>
<span>當(dāng)前{{paginate.page}}頁(yè)拾弃,</span>
<span>共有{{paginate.pages}}頁(yè)</span>
</p>
<p>
<span>
{% if paginate.has_prev %}
<a href="{{ url_for('users.paginate') }}?page={{paginate.prev_num}}">上一頁(yè)</a>
{% else %}
第一頁(yè)
{% endif %}
{% for i in paginate.iter_pages() %}
<a href="{{ url_for('users.paginate') }}?page={{i}}">{{i}}</a>
{% endfor %}
{% if paginate.has_next %}
<a href="{{ url_for('users.paginate') }}?page={{paginate.next_num}}">下一頁(yè)</a>
{% else %}
最后一頁(yè)
{% endif %}
</span>
</p>
{% endblock %}
templates->grade.html
{% extends 'base_main.html' %}
{% block title %}
添加學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
班級(jí)名:<input type="text" name="grade_name"><br>
<input type="submit" value="添加班級(jí)">
</form>
{% endblock %}
templates->course.html
{% extends 'base_main.html' %}
{% block title %}
添加學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
課程名:<input type="text" name="course_name"><br>
<input type="submit" value="添加課程">
</form>
{% endblock %}