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/

回车:

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

Flask 入门(十)的更多相关文章

  1. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  2. Flask入门笔记(一)

    一.程序的基本结构 1.1 最简单的Flask程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #coding=utf-8 # 初始化 from flask import Fla ...

  3. Flask入门HelloWorld

    Flask入门HelloWorld Flask官网:http://flask.pocoo.org/ Flask中文翻译:http://dormousehole.readthedocs.io/en/la ...

  4. Flask入门之结构重组(瘦身)-第13讲笔记

    1. pip list Flask 0.10.1 Flask-Bootstrap 3.3.5.6 Flask-SQLAlchemy 2 Flask-Script 2.0.5 Flask-WTF 0.1 ...

  5. Flask入门之Bootstrap介绍使用和Flask-Nav快速导航栏

    一.Bootstrap Bootstrap,来自 Twitter,是目前最受欢迎的前端框架. Python中,同样可以使用Bootstrap. 1. 导入Bootstrap库 from flask_b ...

  6. Flask入门之Pycharm写Hello Word

    在这里记录整理Flask入门的笔记! 今天讲讲使用Pycharm写一个Hello World 前提是已经安装好Pycharm,安装过程很简单,这里不赘述. 只放两个可以提供注册码的网站: Intell ...

  7. Flask入门和快速上手

    目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...

  8. Flask 入门一( flask 框架和 flask-script 库)

    Flask 入门一( flask 框架 和 flask-script 库) 一.Flask框架: 1.简介 Flask是一个非常小的Python Web框架,被称为微型框架:只提供了一个稳健的核心,其 ...

  9. C#基础入门 十

    C#基础入门 十 Windows应用程序的界面设计 Form.cs:窗体文件,一般用于存放程序员为窗体编写的代码: Form.Designer.cs:窗体设计文件,其中的代码是由VS自动生成的,一般不 ...

  10. Flask入门 flask结构 url_for 重定向(一)

    Flask入门(一) 1 安装虚拟环境Mac,linux sudo pip install virtualenv ​ ubuntu系统 sudo apt-get install python-virt ...

随机推荐

  1. 原生ajax动态添加数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. js 碰撞+拖拽

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Spotlight on Unix/Mysql安装使用详解

    Spotlight on Unix安装使用详解  1.远程连接linux服务器,查看系统是否已经安装sysstat包,如果没有的话,按照以下方法安装sysstat. (1)检查Linux是否安装sys ...

  4. 聊聊 WebSocket,还有 HTTP

    还记得曾经风靡一时的 QQ 秀聊天室吗?那时,还在上初.高中的我们,QQ 是最常用的聊天交友工具:而 QQ 秀聊天室的出现打破了只能按条件查找好友的局限性,大家可以随意进入聊天室房间,进行在线聊天.怀 ...

  5. 基于 HTML5 WebGL 与 GIS 的智慧机场大数据可视化分析【转载】

    前言:大数据,人工智能,工业物联网,5G 已经或者正在潜移默化地改变着我们的生活.在信息技术快速发展的时代,谁能抓住数据的核心,利用有效的方法对数据做数据挖掘和数据分析,从数据中发现趋势,谁就能做到精 ...

  6. C# 通过反射访问类库DLL的路径打开窗体功能

    //通过访问目录下的DLL Assembly ass = Assembly.LoadFile(Application.StartupPath + "\\Design.dll"); ...

  7. xargs命令_Linux xargs命令:一个给其他命令传递参数的过滤器

    本文要为大家介绍的命令是 xargs,我们把它称为护花使者,因为它总是乐于协助其他的命令来完成一些事情.下面一起来看看它是如何护花的. xargs 是 execute arguments 的缩写,它的 ...

  8. Data Management and Data Management Tools

    Data Management ObjectivesBy the end o this module, you should understand the fundamentals of data m ...

  9. PHP7内核(五):系统分析生命周期

    上篇文章讲述了模块初始化阶段之前的准备工作,本篇我来详细介绍PHP生命周期的五个阶段. 一.模块初始化阶段 我们先来看一下该阶段的每个函数的作用. 1.1.sapi_initialize_reques ...

  10. macOS 去掉系统软件更新红点提示

    当前系统提示更新到macOS Catalina .打开终端执行以下命令: 第一步运行: sudo softwareupdate --ignore "macOS Catalina" ...