• Flask 入门(十)


    flask 中的 db.relationship()

    上文提到的方法,也可以找到狗的主人,但是,方便吗?,如果一个人有多只狗呢?

    承接上文,修改main.py中的代码如下:

    #encoding:utf-8
    from flask_sqlalchemy import SQLAlchemy
    from flask import Flask
     
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:005@127.0.0.1:3306/data'
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
    app.config['JSON_AS_ASCII']=False

    db = SQLAlchemy(app)
    db = SQLAlchemy(use_native_unicode='utf8')

    class User(db.Model):
        __tablename__='users'
        id=db.Column(db.Integer,primary_key=True,autoincrement=True)
        name=db.Column(db.String(20),nullable=False)
        dogs=db.relationship('Dog',backref='master')

    class Dog(db.Model):
        __tablename__='dogs'
        id=db.Column(db.Integer,primary_key=True,autoincrement=True)
        name=db.Column(db.String(20),nullable=False)
        master_id=db.Column(db.Integer,db.ForeignKey('users.id'))

    @app.route('/')
    def index():
        db.create_all()
        return '欢迎登录'

    @app.route('/adduser/')
    def addusers():
        user1=User(name='huhai')
        user2=User(name='lanyue')
        db.session.add(user1)
        db.session.add(user2)
        db.session.commit()
        return '添加成功!'


    @app.route('/adddogs/')
    def adddogs():
        dog1=Dog(name='gou1',master_id=1)
        dog2=Dog(name='gou2',master_id=2)
        dog3=Dog(name='gou3',master_id=1)
        dog4=Dog(name='gou4',master_id=2)
        db.session.add(dog1)
        db.session.add(dog2)
        db.session.add(dog3)
        db.session.add(dog4)
        db.session.commit()
        return '添加成功!'

    @app.route('/find_master/<int:dog_id>/')
    def find_master(dog_id):
        dog=Dog.query.filter(Dog.id==dog_id).first()
        return dog.master.name

    @app.route('/find_dogs/<int:user_id>/')
    def find_dogs(user_id):
        user=User.query.filter(User.id==user_id).first()
        alldogs=''
        for dog_temp in user.dogs:
            alldogs=alldogs+dog_temp.name + '  '
        return alldogs
            

    if __name__=='__main__':
        app.run(debug=True)

    关键点详解:

    1.怎么理解 dogs=db.relationship('Dog',backref='master')

    (1).添加到User模型中的dogs属性代表这个关系的面向对象视角。对于一个User类的实例,其dogs属性将返回与角色相关联的用户组成的列表。
    (2).db.Relationship()第一个参数表明这个关系的另一端是哪个模型(类)。如果模型类尚未定义,可使用字符串形式指定。
    (3).db.Relationship()第二个参数backref,将User向类中添加一个master属性,从而定义反向关系。这一属性可替代role_id访问User模型,此时获取的是模型对象,而不是外键的值。

    2.上面的关系为一对多关系的表示,一对一怎么办?
    调用db.Relationship()时需要把userlist参数设置为False。如下:

    db.Relationship('Dog',backref='master',uselist=False)

    3.打开浏览器,

    输入 127.0.0.1:5000/

    回车

    输入 127.0.0.1:5000/adduser/

    回车

    输入 127.0.0.1:5000/adddogs/

    回车

    输入 127.0.0.1:5000/find_dogs/1/

    回车:

    如果出现以下页面,则表示执行成功!

  • 相关阅读:
    Python iter() 函数
    Python file() 函数
    Python bin() 函数
    QTP自动化测试-打开运行报告
    mysql-笔记-数据类型
    mysql-笔记--增删改查
    mysql-笔记-命名、索引规范
    Navicat for MySQL 安装和破解
    mysql client--笔记-修改密码-登录-查看数据库-创建数据库
    安装mysql
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700685.html
Copyright © 2020-2023  润新知