Flask教程(五)

Author: 陳倫巨

Data: 2019-04-09

Email: [email protected]

github: https://github.com/smartisantt

flask中模型關係

參考文檔

模型使用的字段

字段 說明
Integer 整數
String(size) 最大長度字符串
Text 長文本
DateTime 日期和時間
Float 浮點值

一對多( one-to-many relationships)

班級(1)對學生(多)

外鍵寫在多的一方,1的一方用relationship()表示關係。

班級模型:

class Grade(db.Model):
	id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    g_name=db.Column(db.String(10), nullable=False)
    stus = db.relationship('Student', backred='p')

學生模型:

class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(10), unique=True, nullable=False)
    age = db.Column(db.Integer, default=20)
    g_id = db.Column(db.Integer, db.ForeignKey('grade.id'),nullable=True)
    
    __tablename__ = 'stu'

通過班級查詢學生:

@blue.route('/sel_stu_by_grade/')
def sel_stu_by_grade():
    # 查詢Python班級所有學生信息
    g = Grade.query.filter(Grade.g_name == 'Python').first()
    print(g.stus)
    stu_names = [stu.s_name for stu in g.stus]
    print(stu_names)
    return '通過班級查詢學生成功'

通過學生查詢班級:

@blue.route('/sel_grade_by_stu/')
def sel_grade_by_stu():
    # 學生名叫‘小張2’的同學所在班級信息
    stu = Student.query.filter(Student.s_name == '小張2').first()
    print(stu.g_id)
    # 通過反向引用查詢
    print(stu.p)

    return '通過學生查詢班級成功'

多對多( many-to-many relationships)

學生(多)對課程表(多)

學生模型

class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(10), unique=True, nullable=False)
    age = db.Column(db.Integer, default=20)
    g_id = db.Column(db.Integer, db.ForeignKey('grade.id'),nullable=True)

    __tablename__ = 'stu'

課程和學生的中間表(中間表在這裏不是模型,所以無需基礎db.Model)

c_s = db.Table('c_s',
               db.Column('s_id', db.Integer, db.ForeignKey('stu.id')),
               db.Column('c_id', db.Integer, db.ForeignKey('course.id'))
               )

課程表模型

class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    c_name = db.Column(db.String(10), nullable=False, unique=True)
    stus = db.relationship('Student', secondary=c_s, backref='cou', lazy='dynamic')

relationship 的 lazy 屬性指定 sqlalchemy 數據庫什麼時候加載數據:

  • select:就是訪問到屬性的時候,就會全部加載該屬性的數據
  • joined:對關聯的兩個表使用聯接
  • subquery:與joined類似,但使用子子查詢
  • dynamic:不加載記錄,但提供加載記錄的查詢,也就是生成query對象

lazy用法參考文檔

學生表和課程表之間的操作:

@blue.route('/add_cou_to_stu/')
def add_cou_to_stu():
    # 學生添加課程
    # 給id=1的學生添加線代和高數課程
    stu = Student.query.get(1)
    print(stu.cou)
    cou1 = Course.query.filter(Course.c_name == '線代').first()
    cou2 = Course.query.filter(Course.c_name == '高數').first()
    # stu.cou返回的值爲該學生選擇的課程對象組裝成的列表結果
    stu.cou.append(cou1)
    stu.cou.append(cou2)
    # 提交
    db.session.commit()
    return '學生添加課程成功'


@blue.route('/del_stu_cou/')
def del_stu_cou():
    # 刪除id爲1學生所選擇的高數這門課
    stu = Student.query.get(1)
    cou2 = Course.query.filter(Course.c_name == '高數').first()
    # 刪除remove()
    stu.cou.remove(cou2)
    db.session.commit()
    return '刪除課程成功'

總結

一(班級)對多(學生) 多(課程)對多(學生)
stus=db.relationship('Student',backref='p') stus = db.relationship('Student', secondary=c_s, backref='cou')
沒有中間表(ForeignKey寫在多的一方) 需要中間表(ForeignKey寫在中間表)
知道班級查學生:班級對象.stus 知道課程查學生:課程對象.stus
知道學生查班級:學生對象.backref 知道學生查課程:學生對象.backref

附:在此項目中Flask使用的第三方庫版本

Flask==1.0.2
flask-blueprint==1.2.7
Flask-Script==2.0.6
Flask-Session==0.3.1
Flask-SQLAlchemy==2.3.2
PyMySQL==0.9.3
redis==3.2.1
SQLAlchemy==1.3.2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章