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/

回车:

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

原文地址:https://www.cnblogs.com/viplanyue/p/12700685.html