• flask-模型(models)


    1. 一对多 关系模型

    1.1 关联方式
    	1. 在 一 方 模型中 通过 relationship 函数从对象角度关联 多 方
    		db.relationship('多方模型类名称',backref='反向应用名称')
    	2. 在 多方 模型中 通过在 Column() 中设置 ForeignKey() 从数据库表角度设置外键,关联 一 方
    		db.Column(db.Interger,db.ForeignKey("一方表名称.一方表主键"),nullable=False)
    		返回的类属性名为 表中的外键名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    from SQLAlchemyAPP.ext import db
    # db是SQLAlchemy的实例化对象
    
    class School(db.Model):   # "一方"
        __tablename__ = "schools"
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        name = db.Column(db.String(20),nullable=False)
        address = db.Column(db.String(50))
        students = db.relationship("Student",backref="univercity") # 关联学生模型,并设置反向引用名称
    
    class Student(db.Model):   # "多方"
        __tablename__ = "students"
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(20), nullable=False)
        age = db.Column(db.Integer)
        sex = db.Column(db.String(10))
        score = db.Column(db.Float)
        # 在多方从数据库层面关联一方
        school_id = db.Column(db.Integer,db.ForeignKey("schools.id"),nullable=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    操作举例:
    1. 添加 多 方记录
    	1.1 通过外键关联 “一”方:
    	eg: student1 = Student(name="张三",age=20,sex="男",school_id=1)
    	1.2 通过反向引用名称关联“一”方:
    	eg:  student2 = Student(name="李四",age=25,sex="男",university=school1)
    	注:university是反向引用名称
    
    2. 从“一”方查询“多”方
       2.1 通过“一”方模型中relationship()函数对应的类属性直接查询。
       			eg: 已知学校查询学生 school1.students
       
     3. 从“多”方查询“一”方
     	3.1 通过反向引用名称直接查询对应的“一”方实例对象
                eg: 已知学生查询学校  student3.university
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 一对一 关系模型

    	1. 在某一方:db.relationship('另一方模型类名称',backref='反向引用名
    	    称',uselist=False)
    	 2. 在维护关系的“一”方:db.Column(db.Integer,db.ForeignKey("另一方表名称.主
    	     键"),nullable=False,unique=True)
    
    • 1
    • 2
    • 3
    • 4
    # 被依赖的 一方
    class Person(db.Model):
    	__tablename__ = "person"
    	id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    	name = db.Column(db.String(20),nullable=False)
    	# uselist = False ,指定该类属性(card 类属性) 禁用列表结果
    	card = db.relationship("Card",backref="per",uselist=False)
    # 依赖的 一方
    class Card(db.Model):
    	__tablename__ = "cards"
    	id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    	cardno = db.Column(db.String(20),unique=True)
    	# 设置唯一外键
    	person_id = db.Column(db.Integer,db.ForeignKey("person.id"),unique=True) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3. 多对多 关系

    1. 创建 db = SQLAlchemy()
    2. db.Table() 创建中间关系表
    3. 创建两个 多 方模型
    
    • 1
    • 2
    • 3
    # 实例化 db
    db = SQLAlchemy()
    # 中间关系表对应的代码
    user_group = db.Table( "user_group_relation",
    	db.Column("userid",db.Integer,db.ForeignKey("users.id"),primary_key=True),
    	db.Column("groupid",db.Integer,db.ForeignKey("groups.id"),primary_key=True),
    )
    
    # 要户模型
    class User(db.Model):
           __tablename__ = 'users'
           id = db.Column(db.Integer,primary_key=True)
           name = db.Column(db.String(20))
           ugroups = db.relationship("Group",secondary=user_group,backref=db.backref("gusers"))
    
    # 组模型
    class Group(db.Model):
           __tablename__ = 'groups'
           id = db.Column(db.Integer, primary_key=True)
           name = db.Column(db.String(20))
           
    # 具体操作 添加两个用户
    user1 = User(name="令狐冲")
    user2 = User(name="郭靖")
    user3 = User('黄蓉')
    db.session.add(user1)
    db.session.add(user2) 
    db.session.add(user3)
    db.session.commit()
    
    # 添加三个组
    group1 = Group(name="乒乓球组")
    group2 = Group(name="喝酒组")
    group3 = Group(name="读书组")
    db.session.add(group1)
    db.session.add(group2)
    db.session.add(group3)
    db.session.commit()
    
    # 添加关联关系
    user1.ugroups.append(group1)
    user1.ugroups.append(group2)
    db.session.commit()
    
    user2.ugroups.append(group1)
    user2.ugroups.append(group3)
    db.session.commit()
    
    # 也可以通过组,主动关联人
    group3.gusers.append(user3)
    
    # 用户关联多个组,也可以使用extend
    user2.ugroups.extend([group1,group3])
    
    # 查询user1加入的组名称:
     for g in user1.ugroups:
            print(g.name)
    # 查询加入group1的用户姓名:
    for u in group1.gusers:
            print(u.name) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
  • 相关阅读:
    大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
    【Jetpack】Navigation 导航组件 ③ ( 为 Navigation Graph 页面跳转 action 添加跳转动画 )
    倪师哲学。把智慧和时间都用在学习知识上
    十三、企业开发(5)
    Chrome内存追踪
    uni-app ——商品规格多选择以及收货地址的实现思路详解
    windows中elasticsearch7中添加用户名密码验证
    MySQL 索引分类
    “数字游民”热潮席卷全球,未来十年或将达到10亿人!
    开源数据库 PolarDB 为什么能捕获娃哈哈的心?
  • 原文地址:https://blog.csdn.net/weixin_45054115/article/details/127622940