16、flask-模型-models-表的操作-多表操作-多对多
- 代码如下:
变化的只有models.py和views.py
models.py
"""
用户 : 电影 = N : M
"""
# 中间表 : 收藏电影的用户
collect = db.Table(
'collects',
db.Column('user_id', db.Integer, db.ForeignKey('usermodel.id'), primary_key=True), #外键关联用户表的id
db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True) #外键管理电影表的id
)
#用户表
#用户可以收藏电影
class UserModel(db.Model):
__tablename__ = 'usermodel'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50), unique=True)
age = db.Column(db.Integer)
#电影表
class Movie(db.Model):
__tablename__ = 'movie'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50))
# 关联
# 第一个参数是关联的模型名(类名)
# 第二个参数是反向引用的名称,grade对象、让student反过来得到grade对象的名称:student.grade
# 第三个参数:懒加载,当调用时才去加载
# secondary 设置中间表
users = db.relationship('UserModel', backref='movies', lazy='dynamic', secondary=collect)
'''
lazy:属性
- 懒加载:可以延迟在使用关联属性的时候才建立关联
lazy='dynamic' :会返回一个query对象(查询集), 可以继续使用其他查询方法、如all()
lazy='select': 首次访问到属性的时候,就会全部加载该属性的数据
lazy='joined':在对关联的两个表进行join操作、从而获得所有相关的对象
lazy='True':返回一个可用的列表对象、通select
'''
views.py
import random
from flask import Blueprint, request, render_template
from .models import *
#创建蓝图(路由)
blue = Blueprint('user', __name__)
@blue.route('/')
def index():
return 'index'
# ---------------------------多对多---------------------------------
# 增
# 添加用户
@blue.route('/adduser/')
def add_user():
users = []
for i in range(10, 14):
user = UserModel()
user.name = f'小新{i}'
user.age = i
users.append(user)
try:
db.session.add_all(users)
db.session.commit()
except Exception as e:
print(e)
db.session.rollback()
db.session.flush()
return '增加成功'
# 添加电影
@blue.route('/addmovie/')
def add_movie():
movies = []
for i in range(10, 14):
movie = Movie()
movie.name = f'阿凡达-{i}'
movies.append(movie)
try:
db.session.add_all(movies)
db.session.commit()
except Exception as e:
print(e)
db.session.rollback()
db.session.flush()
return '增加成功'
# 添加收藏
@blue.route('/addcollect/')
def add_collect():
# 用户收藏电影
user = UserModel.query.get(1)
movie = Movie.query.get(2)
# 这里的movies是 models.py模型中的电影表中:
# users = db.relationship('UserModel', backref='movies', lazy='dynamic', secondary=collect)
# 可以通过movies属性来添加收藏电影
user.movies.append(movie)
db.session.commit()
return '增加成功'
# 查询
@blue.route('/getcollect/')
def get_collect():
# 查询某个用户收藏的电影
user = UserModel.query.get(1)
print(user.movies) # 查询用户收藏的电影
# 查找手残了某电影的所有用户
movie = Movie.query.get(4)
print(movie.users)
print(list(movie.users))
return '查询成功'
# 修改和单表操作一样
# 删除
@blue.route('/deluser/')
def del_user():
# 级联删除 - 删除用户之后、相应的关联的collect表中的用户也会被删除
user = UserModel.query.get(1)
db.session.delete(user)
db.session.commit()
return '删除成功'