首页 > 其他分享 >16、flask-模型-models-表的操作-多表操作-多对多

16、flask-模型-models-表的操作-多表操作-多对多

时间:2024-07-27 21:55:06浏览次数:16  
标签:多表 16 flask movie db movies session user True

  • 代码如下:

变化的只有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 '删除成功'

标签:多表,16,flask,movie,db,movies,session,user,True
From: https://www.cnblogs.com/littlecc/p/18327463

相关文章

  • 15、flask-模型-models-表的操作-多表操作-一对多
    这里选择学生表和班级表作为案例app.pyfromAppimportcreate_appapp=create_app()if__name__=='__main__':app.run(debug=True)#运行:flaskrun--debugviews.pyimportrandomfromflaskimportBlueprint,request,render_templatefrom.modelsimpo......
  • BUUCTF 3.warmup_csaw_2016
    拿到题目,我们先运行一下我们发现这道题的样子和BUUCTF的rip很像,一样是让我们输入,一样是在输入超长字符串后程序会崩溃,所以我们可以猜测是一道栈溢出的问题,我们来看一下保护机制我们发现依旧是几乎没开保护机制,所以大概率是一道栈溢出的题。我们看一下IDA我们发现最后的get......
  • 一个月收益高达16.5K,来看我是如何通过Python技术手段变现,逐步迈向财富自由的!
    写在开篇随着大数据和人工智能的兴起。各行业对爬虫类和数分类服务的需求量呈指数级的暴增。传统行业受经济下行的影响,近段时间失业找不到工作的朋友,后台咨询技术变现、兼职接单问题也越来越多。​当然也有网友向我发来喜报,告诉我他上半年通过爬虫单月接单1.65w,给兼职副......
  • SpringCloud+Vue3多对多,多表联查
    ♥️作者:小宋1021......
  • 15、flask-模型-models-表的操作-分页paginate()
    paginate()的属性属性名说明items返回当前页的内容列表has_next是否还有下一页has_prev是否还有上一页next(error_out=False)返回下一页的pagination对象prev(error_out=False)返回上一页的Pagination对象page当前页的页码pages总页数per_p......
  • 题解:CF1608F MEX counting
    题解:CF1608FMEXcounting与其他题解不同,本篇题解是运用辅助数组$g$来解决问题。虽然代码可能要繁琐一点,但是辅助数组的思路适用范围更广一点。首先还是转化为前$i$个数的$mex$在区间$[l_i,r_i]$内。我们用dp数组$f_{i,x,c}$表示处理到了第$i$个数,当前的mex为......
  • 基于Python flask 的豆瓣电影top250数据评分可视化
    跟着CSDN上学习一下爬虫和简单的可视化分析,最后完成了一个简单的小项目。1.项目简介        基于Pythonflask的豆瓣电影评分可视化。通过采用Python编程语言,使用flask框架搭建影视系统,并使用相关技术实现对豆瓣网站的爬取、数据存储和可视化分析。2、成果展示:......
  • 14、flask-模型-models-表的操作-增删改查
    1.单表操作1.修改表结构接着上一步的数据迁移后、生成了表,接下来就要对表的操作这里稍微对表结构改了一下models.pyfrom.extsimportdb#导入db对象classUser(db.Model):#表名__tablename__='user'#字段id=db.Column(db.Integer,primar......
  • 如何将flask应用程序分成多个py文件?
    我的Flask应用程序当前由一个具有多个路径的文件组成,并定义了路径。有什么方法可以创建一个test.py文件,其中包含main()中未处理的路由吗?test2.py我担心test.py中的路由太多,并且希望使其可以run@app.route('/somepath')defsomehandler(......
  • Navicat premium最新【16/17 版本】安装下载教程,图文步骤详解(超简单,一步到位,免费下载
    文章目录软件介绍软件下载安装步骤激活步骤软件介绍Navicat是一款快速、可靠且功能全面的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设计。以下是对Navicat的详细介绍:一、产品概述开发目的:Navicat旨在通过其直观和设计完善的用户界面,帮助数据库管......