Flask模型进阶--03

本文介绍了Flask中数据库模型的构建,包括一对多和多对多关系的设置。在一对多关系中,详细展示了如何定义班级与学生的关系,以及如何查询和删除数据。对于多对多关系,以用户收藏电影为例,解释了如何创建中间表及进行查询、删除和增加操作。最后,提出了一个图书馆项目的实战场景,涉及作者、书籍和出版社之间的关系处理。
摘要由CSDN通过智能技术生成

前言

Flask模型基础在这里…

1. 多表关联

1.1 一对多

# 一对多
class Grade(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(16))
    # 定义班级标的一对多关系,不是字段, Student为学生表模型, backref为反向查找名称
    students = db.relationship('Student', backref='grade1', lazy=True)

class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(16))
    age = db.Column(db.Integer, default=1)
    # 创建外键,关联到班级表的主键,实现一对多关系,班级表中也要有对应操作
    grade = db.Column(db.Integer, db.ForeignKey(Grade.id)): 
        # 获取学生的所在班级信息(反向)
		stu = Student.query.get(stuid)
    	grade = stu.stus
        
    	# 获取班级的所有学生 (正向)
        grade = Grade.query.get(gradeid)
        students = grade.students
	  删:
            # 删除班级后, 学生的grade字段会变为null
            grade = Grade.query.get(id)
            db.session.delete(grade)
            db.session.commit()

1.2 多对多

用户收藏电影,一个用户可以收藏多部电影, 一部电影可以被不同的用户收藏, 是一个多对多关系.

# 中间表(不是类)
collects = db.Table('collects',
    # user_id为表字段名称, user.id为外键表的id
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True)
) 

class Movie(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(200))

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(16))
    age = db.Column(db.Integer, default=1)
    # 多对多  关联的学生表格的模型, 中间表的名称, 反向查找
    movies = db.relationship('Movie',  backref='users', 
                             	secondary=collects, lazy='dynamic')
    
    lazy属性:
        懒加载,可以延迟在使用关联属性的时候才建立关联
    	  lazy='dynamic': 会返回一个query对象(查询集),可以继续使用其他查询方法,如all().
    	  lazy='select': 首次访问到属性的时候,就会全部加载该属性的数据.
          lazy='joined': 在对关联的两个表进行join操作,从而获取到所有相关的对象
          lazy=True:  返回一个可用的列表对象,同select
	    
查:
	# 查询用户收藏的所有电影
	 user = User.query.get(id)
     movies = user.movies
        
	# 查询电影被哪些用户收藏
     movie = Movie.query.get(id)
     users = movie.users
    
删:
	# 中间表的数据会被级联删除
     movie = Movie.query.get(id)
     db.session.delete(movie)
     db.session.commit()
     
增:
	# 用户收藏电影
    user = User.query.get(id)
    movie = Movie.query.get(id)
    user.movies.append(movie)
    db.session.commit()

2. 实战:图书馆项目

创建一个项目, 用来说明出版社, 书籍和作者的关系。
假定关系:作者:书籍 => 1:n  (一本书由一个作者完成, 一个作者可以创作多本书)
		出版社:书籍 => n:n  (一个出版社可以出版多本书, 一本书可以由多个出版社出版)
要求:
	1.在书籍的book_index.html中有一个"查看所有书籍"的超链接按钮,点击进入书籍列表book_list.html页面.
	2.在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html
	3.在书籍book_detail.html中可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html页面
	
	# 作者
    class Author(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(20), unique=True)
        age = db.Column(db.Integer, default=1)
        sex = db.Column(db.Boolean, default=True)
        email = db.Column(db.String(200))
        # 关系
        books = db.relationship('Book', backref='author', lazy='dynamic')

    # 书籍
    class Book(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        title = db.Column(db.String(100), unique=True)
        date = db.Column(db.DateTime)
        # 1对多,外键
        author = db.Column(db.Integer, db.ForeignKey(Author.id))

    # 中间表(书籍-出版社)
    book_publisher = db.Table('book_publisher',
        db.Column('book_id', db.Integer, 
                  db.ForeignKey('book.id'), primary_key=True),
        db.Column('publisher_id', db.Integer, 
                  db.ForeignKey('publisher.id'), primary_key=True)
    )

    # 出版社
    class Publisher(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(20), unique=True)
        address = db.Column(db.String(200))
        city = db.Column(db.String(100))
        province = db.Column(db.String(100))
        country = db.Column(db.String(100))
        website = db.Column(db.String(100))
        # 多对多, 关联book表
        books = db.relationship('Book', backref='publishers', 
                                secondary=book_publisher, lazy='dynamic')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiayi_init_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值