Flask学习回顾(七)

一、反向引用

反向引用:
In [1]: from Flask_SQLalchemy_demo import *

添加一个角色和两个用户
In [2]: role = Role(name = 'admin')

In [3]: db.session.add(role)

In [4]: db.session.commit()

In [5]: user1 = User(name='zs', role_id = role.id)

In [6]: user2 = User(name='ls', role_id = role.id)

In [7]: db.session.add_all([user1, user2])

In [8]: db.ses
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-52cc6e1a39e6> in <module>
----> 1 db.ses

AttributeError: 'SQLAlchemy' object has no attribute 'ses'

In [9]: db.session.commit()

实现关系引用查询:

In [10]: role.users
Out[10]: [<User: zs 1 None None>, <User: ls 2 None None>]

In [11]: user1.role
Out[11]: <Role: admin 1>

In [12]: user2.role
Out[12]: <Role: admin 1>

In [13]: user2.role.name
Out[13]: 'admin'

In [14]: user1.role.users
Out[14]: [<User: zs 1 None None>, <User: ls 2 None None>]

Flask_SQLalchemy_demo.py代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
import pymysql

app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
# 配置数据库的地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/flask_sql_demo?charset=utf8mb4'

# 跟踪数据库的修改 --> 不建议开启 未来的版本中会移除
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

db = SQLAlchemy(app)

'''
两张表
角色(管理员 / 普通用户)
用户(角色ID)
'''

# 数据库的模型,需要继承db.Model
class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'

    # 定义字段
    # db.Column表示是一个字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)

    # 在一的一方,写关联
    # users = db.relationship('User'):表示和User模型发生了关联,增加了一个users属性
    # backref =  'role': 表示role是User要用的属性
    users = db.relationship('User', backref =  'role')

    # repr()方法显示一个可读字符串
    def __repr__(self):
        return '<Role: %s %s>' % (self.name, self.id)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    # db.ForeignKey('roles.id') 表示是外键。表名.id
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    # User希望有role属性,但是这个属性的定义,需要在另一个模型中定义

    def __repr__(self):
        return '<User: %s %s %s %s>' % (self.name, self.id, self.email, self.password)
@app.route('/')
def index():
    return 'Hello World!'

db.drop_all()
db.create_all()

if __name__ == '__main__':

    app.run()

    # 删除表
    # db.drop_all()

    # 创建表


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值