Day19-flask-關(guān)系模型及分頁(yè)

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 '添加成功'
  1. 通過(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
                                )
    
    
  2. 通過(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 %}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摆霉,隨后出現(xiàn)的幾起案子豪椿,更是在濱河造成了極大的恐慌,老刑警劉巖携栋,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搭盾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡婉支,警方通過(guò)查閱死者的電腦和手機(jī)鸯隅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)向挖,“玉大人蝌以,你說(shuō)我怎么就攤上這事『沃” “怎么了跟畅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)溶推。 經(jīng)常有香客問(wèn)我徊件,道長(zhǎng),這世上最難降的妖魔是什么蒜危? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任虱痕,我火速辦了婚禮,結(jié)果婚禮上辐赞,老公的妹妹穿的比我還像新娘部翘。我一直安慰自己,他們只是感情好响委,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布新思。 她就那樣靜靜地躺著,像睡著了一般晃酒。 火紅的嫁衣襯著肌膚如雪表牢。 梳的紋絲不亂的頭發(fā)上窄绒,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天贝次,我揣著相機(jī)與錄音,去河邊找鬼彰导。 笑死蛔翅,一個(gè)胖子當(dāng)著我的面吹牛敲茄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播山析,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼堰燎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了笋轨?” 一聲冷哼從身側(cè)響起秆剪,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爵政,沒(méi)想到半個(gè)月后仅讽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钾挟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年洁灵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺出。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徽千,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汤锨,到底是詐尸還是另有隱情双抽,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布泥畅,位于F島的核電站荠诬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏位仁。R本人自食惡果不足惜柑贞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聂抢。 院中可真熱鬧钧嘶,春花似錦、人聲如沸琳疏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)空盼。三九已至书幕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揽趾,已是汗流浹背台汇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苟呐。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓痒芝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牵素。 傳聞我的和親對(duì)象是個(gè)殘疾皇子严衬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,456評(píng)論 0 13
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 7,815評(píng)論 5 116
  • 觀其大綱 page 01 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 M...
    周少言閱讀 3,158評(píng)論 0 33
  • 昨日清晨接到好友電話,得知一個(gè)噩耗笆呆,時(shí)至此刻我的內(nèi)心也不愿意承認(rèn)那是真的请琳。就在前兩天,曾經(jīng)做過(guò)三四年同事的孩...
    天地一Sa歐閱讀 178評(píng)論 0 1
  • 喬幫主在發(fā)布會(huì)上提到赠幕,用戶的手才是最好的輸入設(shè)備单起,的確,iPhone之后劣坊,非觸屏手機(jī)再已難覓嘀倒。觸摸是最基本的用戶輸...
    皮皮Warrior閱讀 2,233評(píng)論 3 48