1、创建关联模型类(一对多)

在视图函数中定义模型类

from flask import Flask
app = Flask(__name__)

class Config():
   DEBUG = True
   # 数据类型://登录用户:登录密码@数据库IP或地址:端口/数据库名
   SQLALCHEMY_DATABASE_URI = 'mysql://root:123@127.0.0.1:3306/flaskDemo'
   # 动态追踪修改设置,如未设置只会提示警告
   SQLALCHEMY_TRACK_MODIFICATIONS = True
   #查询时会显示原始SQL语句
   SQLALCHEMY_ECHO = True

app.config.from_object(Config)


# 数据库初始化
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

# 创建模型
class User(db.Model):
   """用户"""
   # 模型相关声明
   __tablename__ = "user"

   # 模型字段信息
   id = db.Column(db.Integer, primary_key=True,autoincrement=True,comment="ID")
   name = db.Column(db.String(20), index=True, comment="用户名")
   age = db.Column(db.Integer, nullable=True, comment="年龄")
   sex = db.Column(db.Boolean, default=True, comment="性别")
   created_time = db.Column(db.DateTime, comment="创建时间")
   role = db.Column(db.SmallInteger, db.ForeignKey("role.id") ) # role.id 是表名和表字段名

   # 自定义模型操作方法
   def __repr__(self):
       """当把模型输出时,展示的内容"""
       return "%s" % self.name

class Role(db.Model):
   """角色"""
   __tablename__ = "role"

   id = db.Column(db.SmallInteger, primary_key=True, comment="ID")
   name = db.Column(db.String(20), index=True, comment="角色名")
   # 注意,这个user_list不是字段,不会在创建表的时候,加入到数据中,这个字段是ORM自己处理的。User是上面定义的模型类,若该模型类在本文件中定义,则可不加引号;若该模型类是导包过来的,则需要加引号。(建议都加引号)
   user_list = db.relationship("User", backref='myrole')

   def __repr__(self):
       return "%s" % self.name

@app.route("/")
def index():
   return "ok"


if __name__ == '__main__':
   # 创建所有表, 根据当前系统应用中模型对应的数据表
   # db.create_all()
   # 删除所有表
   # db.drop_all()

   app.run(host="0.0.0.0", port=8080,debug=True)
 

 

2、查询

正向查询:

从 user 表中查角色名,使用Role模型中定义的 backref进行正向查询角色名

user = User.query.filter(User.name=="22").first()  # 查询name=“22”的信息,user为对象
role = Role.query.filter(Role.name=="金牌会员").first() # role为name=“金牌会员”的对象
print(user,user.role) # 查询的只是role的id,不能查到角色名

 

# 使用Role模型中定义的 backref进行正向查询角色名

print(user.myrole)

 

正向查询

从 role 表查询 id=1 的角色名使用的 user

user = User.query.filter(User.name=="22").first()  # 查询name=“22”的信息,user为对象
role = Role.query.filter(Role.id==1).first() # role为name=“金牌会员”的对象

 

# 使用 Role 模型中的 user_list(不是字段)来进行正向查询id=1 的角色名使用的 user

print(role.user_list)

 

反向查询:

从 user 表中查角色名

user = User.query.filter(User.name=="22").first()  # 查询name=“22”的信息,user为对象
role = Role.query.filter(Role.id==1).first() # role为name=“金牌会员”的对象
 
# 先查询name=“22”的user对象
user = User.query.filter(User.name=="22").first()  # 查询name=“22”的信息,user为对象
 
# 再查询name=“22”在user表中所对应的role值(role_id值)
print(user.role)
 
# 将role_id带入到role表中进行查询此时的 id = role_id 的name即可
role = Role.query.filter(Role.id==role_id).first()
print(role.name)

 

 

反向查询:

从 role 表查询 name=“金牌会员” 的角色名使用的 user

user = User.query.filter(User.name=="22").first()  # 查询name=“22”的信息,user为对象
role = Role.query.filter(Role.id==1).first() # role为name=“金牌会员”的对象
 
# 先查询name=“金牌会员”的role对象
role = Role.query.filter(Role.name==“金牌会员”).first()
 
# 根据role对象再查询在role表中所对应的 id 值
print(role.id)
 
# 将role中查到的 id 带入到 user 表中进行查询此时的 role= role中查询的 id 获取user对象
user = User.query.filter(User.role==role_id).all()
print(user)

 

 

 

 

 

 posted on 2019-12-04 12:06  墨语i  阅读(848)  评论(0)    收藏  举报