Flask中一对多,一对一,多对多模型

1、一个非常简单的例子

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

2、一对多关系

# 一
class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',lazy='dynamic')

# 多
class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
addresses = db.relationship('Address', backref='person',lazy='dynamic')

       relationship函数:sqlalchemy对关系之间提供的一种便利的调用方式,关联不同的表;

       backref参数:对关系提供反向引用的声明,在Address类上声明新属性的简单方法,之后可以在my_address.person来获取这个地址的person;

       lazy参数:决定了 SQLAlchemy 什么时候从数据库中加载数据,有四个可选方式:'select','joined','subquery','dynamic':

  • 'select'(默认值):SQLAlchemy 会在使用一个标准 select 语句时一次性加载数据;
  • 'joined':让 SQLAlchemy 当父级使用 JOIN 语句是,在相同的查询中加载关系;
  • 'subquery':类似 'joined' ,但是 SQLAlchemy 会使用子查询;
  • 'dynamic':SQLAlchemy 会返回一个查询对象,在加载这些条目时才进行加载数据,大批量数据查询处理时推荐使用。
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

       ForeignKey参数:代表一种关联字段,将两张表进行关联的方式,表示一个person的外键,设定上必须要能在父表中找到对应的id值。

3、一对一关系

class Parent(Base):
    id = Column(Integer, primary_key=True)
    child_id = Column(Integer, ForeignKey('child.id'))
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base):
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

在一对多关系基础上的父表中使用backref函数,并添加uselist参数来表示一对一关系。

4、多对多关系

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)

如果想要用多对多关系,需要在两个类之间增加一个关联的辅助表。

tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic'))

secondary参数:指定多对多关系中关系表的名字;

backref函数:由于在这里我们需要在每一页显示多个标签,所以使用backref参数添加一个反向引用,配置 Page.tags 加载后作为标签的列表。

 

转载于:https://www.cnblogs.com/notzy/p/9187232.html

Flask-SQLAlchemy进行多对多查询可以通过间表来实现。以下是一个示例代码: 假设我们有两个模型:User和Role,它们之间是多对多的关系。我们可以创建一个名为user_role的间表来存储用户和角色之间的关系。 ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri' db = SQLAlchemy(app) user_role = db.Table('user_role', db.Column('user_id', db.Integer, db.ForeignKey('user.id')), db.Column('role_id', db.Integer, db.ForeignKey('role.id')) ) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) roles = db.relationship('Role', secondary=user_role, backref=db.backref('users', lazy='dynamic')) class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) # 查询某个用户的所有角色 user = User.query.filter_by(name='wang').first() roles = user.roles # 查询某个角色的所有用户 role = Role.query.filter_by(name='admin').first() users = role.users # 查询拥有特定角色的所有用户 role = Role.query.filter_by(name='admin').first() users = User.query.filter(User.roles.contains(role)).all() ``` 在上述代码,我们定义了一个间表user_role,它包含了user_id和role_id两个外键。User模型和Role模型之间通过db.relationship进行关联,并通过secondary参数指定了间表。这样,我们就可以通过User.roles和Role.users来查询相关的角色和用户了。 请注意,你需要根据自己的数据库设置来配置SQLALCHEMY_DATABASE_URI的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Flask-SQLAlchemy的安装使用 一对多 多对多join查询](https://blog.csdn.net/HYESC/article/details/129022912)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值