• python第三篇:python、flask关系映射


    python中关系映射主要包括三种:一对多关系映射、一对一关系映射、多对多关系映射。

    一对多关系映射
    一方:Student(学生)
    添加关联属性和反向引用
    多方:Article(文章)
    添加外键关联
    
    一对一关系映射
    一方:Student(学生)主表
    添加多对多的关联属性和反向引用,同时uselist取值为FALSE,表示fetchone
    添加第三张表的关联属性和反向引用关系
    一方:Detail(详情表)次表
    添加外键关联
    
    多对多关系映射
    多方:Users
    添加多对多的关联属性和反向引用,同时指明第三张关联表(2)
    添加对第三张表的关联属性和反向引用(2)
    多方:Goods
    添加对第三张表的关联属性和反向引用(2)
    第三张关联表:UsersGoods

    一对多关系映射

    # 一方
    class Student(db.Model):
    __tablename__ = "student"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加关联属性和反向引用关系
    # 关联属性:在student对象中通过哪个属性能够得到对应的所有的article对象
    # 反向引用:在article对象中通过哪个属性能够得到它对应的student
    articles = db.relationship('Article', backref="student", lazy="dynamic")
    
    def __init__(self, name):
    self.name = name
    
    def __repr__(self):
    return "<Student:%r>" % self.name
    
    # 多方
    class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加一个列(外键):引用自article表的主键,这一段代码是为了生成数据库关联。
    student_id = db.Column(db.Integer, db.ForeignKey('student.id')) # 这里的student是数据库表名
    
    def __init__(self, name):
    self.name = name
    
    def __repr__(self):
    return "<Article:%r>" % self.tname

    一对一关系映射

    # 一方
    class Student(db.Model):
    __tablename__ = "student"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加关联属性和反向引用关系
    # 关联属性:在student对象中通过哪个属性能够得到detail信息
    # 反向引用:在detail对象中通过哪个属性能够得到它对应的student
    # uselist is for the purpose of fetchone
    user = db.relationship('Detail', backref='student', uselist=False)
    
    def __init__(self, name):
    self.name = name
    
    def __repr__(self):
    return "<Student:%r>" % self.name
    
    class Detail(db.Model):
    __tablename__ = 'detial'
    id = db.Column(db.Integer, primary_key=True)
    weight = db.Column(db.Float)
    student_id = db.Column(db.Integer, db.ForeignKey('student.id'))

    多对多关系映射

    class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(80),nullable=False,unique=True)
    age = db.Column(db.Integer)
    email = db.Column(db.String(120),unique=True)
    isActive = db.Column(db.Boolean,default=True)
    
    # 添加多(Users)对多(Goods)的关联属性和反向引用关系
    # 涉及到第三张关联表 - users_goods
    goods=db.relationship(
    'Goods',
    secondary='users_goods',
    lazy="dynamic",
    backref=db.backref(
    "users",
    lazy='dynamic')
    )
    
    #增加对UsersGoods的关联属性和反向引用关系:目的是为了创建Users类 与 UsersGoods类 之间的关系
    userGoods = db.relationship('UsersGoods',backref="user",lazy="dynamic")
    
    
    class Goods(db.Model):
    __tablename__ = "goods"
    id = db.Column(db.Integer,primary_key=True)
    gname = db.Column(db.String(80))
    gprice = db.Column(db.Float)
    
    #增加对UsersGoods类的关联属性和反向引用关系
    goodUsers = db.relationship('UsersGoods',backref="good",lazy="dynamic")
    
    # 创建 users_goods 的第三张关联表,从而来表示多对多的关系
    class UsersGoods(db.Model):
    __tablename__ = "users_goods"
    id = db.Column(db.Integer,primary_key=True)
    users_id = db.Column(db.Integer,db.ForeignKey('users.id'))
    goods_id = db.Column(db.Integer,db.ForeignKey('goods.id'))
    count = db.Column(db.Integer,default=1)
    
    # user.goods
    # user.userGoods
    # good.users
    # good.goodUsers
    # goodUsers.good
    # userGoods.user

  • 相关阅读:
    wpf中防止界面卡死的写法
    wpf list<T>与ObservableCollection<T>的区别
    wpf 将对象按照正圆的顺序排列的写法
    .net 如何高效地使用string(转)
    wpf 查找DataTemplate中的控件的实现方式
    wpf 属性变更通知类的实现
    wpf 3D图形的实现(转)
    SpringBoot之HandlerInterceptorAdapter
    websocket简单实现
    mockjs基本使用
  • 原文地址:https://www.cnblogs.com/leijing0607/p/7272843.html
Copyright © 2020-2023  润新知