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 '删除成功'
posted @ 2024-07-27 21:41  little小新  阅读(8)  评论(0编辑  收藏  举报