Flask 表关系<一对多,多对多>定义,查询:

本文介绍了如何在Flask中通过SQLAlchemy实现一对一和一对多的关系,并通过实例演示了如何查询和操作。接着详细讲解了多对多关系的建立,以博客与标签为例,展示了如何通过中间表和backref进行关联。最后,以用户权限管理为场景,展示了多对多关系在实际应用中的使用。
摘要由CSDN通过智能技术生成

一对多关系 >>

# 1.一对多关系的建立: 一方建立关系, 多方建立外键
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

# 专业模型
class Sub(db.Model):
    __tablename__ = 'sub'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    # 一方定义关系, 关联Stu模型, Stu为类名, 不是表名哦; 
    # backref的值是给"多方"用来查询"一方"的
    stu = db.relationship('Stu', backref='sub')  

    def __repr__(self):
        return self.name

# 学生模型
class Stu(db.Model):
    __tablename__ = 'stu'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    age = db.Column(db.Integer)
    snum = db.Column(db.Integer, unique=True)
    # 多方定义外键, 关联sub.id
    sub_id = db.Column(db.Integer, db.ForeignKey('sub.id'))
    

    def __repr__(self):
        return self.name
# 2.一对多关系的查询:
从一查多:
    sub = Sub.query.get(1)
    stus = sub.stu  # 不需要.all()
    
从多查一:
    stu = Stu.query.get(2)
    sub = stu.sub  # stu.stu中的第2个stu为backref的值,返回的是sub对象

 多对多关系 >>

# 多对多关系的建立
	1. 先把两个需要做多对多的模型定义出来
	2. 使用Table定义一个中间表,中间表一般就是包含两个模型的外键字段就可以了,并且让他们两个来作为一个“复合主键”。
	3. 在两个需要做多对多的模型中随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系,在使用relationship的时候,需要传入一个secondary=中间表模型名。 
    
# 以博客文章与标签为例, 示例如下:
# 中间表
article_tag = db.Table(
    'article_tag',
    db.Column('article_id', db.Integer, db.ForeignKey("article.id"),primary_key=True),
    db.Column('tag_id', db.Integer, db.ForeignKey("tag.id"), primary_key=True)
)


# 文章表
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64))
    tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles'))

    def __repr__(self):
        return self.title

# 标签表
class Tag(db.Model):
    __tablename__ = 'tag'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    def __repr__(self):
        return self.name
# 多对多关系的查询
# 1.查询文章所有的标签:
article = Article.query.filter(Article.title="xxx").first()
tags = article.tags

# 2.查询一个标签涉及的所有文章:
tag = Tag.query.get(2)
print('标签: ', tag)
articles = tag.articles  # tag.articles中的articles是Article表中关系中backref的值
print('文章: ', articles)

 多对多关系 用户权限 案例:

class UserModel(db.Model):
    uid = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(10), comment='用户名')
    mobile = db.Column(db.String(11), comment='手机号')
    money = db.Column(db.DECIMAL(10, 2), comment='财产')
    role_id = db.Column(db.Integer, db.ForeignKey('role_model.rid'), comment='角色ID')

# 中间表字段定义
role_access = db.Table(
    'role_access',
    db.Column('role_id', db.Integer, db.ForeignKey('role_model.rid'), primary_key=True),
    db.Column('access_id', db.Integer, db.ForeignKey('access_model.aid'), primary_key=True)
)


# 角色
class RoleModel(db.Model):
    rid = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(10), nullable=False, default='', comment='角色名')
    user = db.relationship('UserModel', backref='role')

    access = db.relationship('AccessModel', secondary=role_access, backref='role')
    # 在AccessModel中绑定也一样 必须绑定一个
    # secondary=  声明中间表,不加引号


# 权限
class AccessModel(db.Model):
    aid = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(32), nullable=False, default='', comment='权限名字')
    path = db.Column(db.String(64), nullable=False, default='', comment='路由')
    method = db.Column(db.String(16), nullable=False, default='', comment='请求方式')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值