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. flask连接数据库的URI书写格式

    1. MySQL mysql://username:password@hostname/database 2. PostgreSQL postgresql://username:password@ho ...

  2. MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

    网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...

  3. 036.集群网络-K8S网络模型及Linux基础网络

    一 Kubernetes网络模型概述 1.1 Kubernetes网络模型 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的 ...

  4. Python 之装饰器

    Python 的装饰器可谓是提高开发效率的一大利器.然而初学装饰器的时候感觉很难理解,因为除了 Python 之外没听说哪个语言有这种东西. 而且网上看的很多解释看似容易理解,但只能很快理解了装饰器能 ...

  5. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  6. go第三方常用包

    配置 go-ini/ini 用于读取 ini 格式配置文件. 地址:https://github.com/Go-ini/ini tomal 用于读取 conf 格式配置文件. 地址:https://g ...

  7. 常用正则表达式(手机号、邮箱、URL地址、身份证等等)

    一.前言 不好的习惯:1.每一次用到正则都是上网copy一份,也没有去学习思考,看看都是什么意思: 2.一个项目里不同的地方用到了相同的校验,一直在重复的copy代码,并没有统一起来,万一哪天要修改规 ...

  8. Redis源码分析: String(SDS)容量调整分析

    整体思路: 1 惰性缩容.不释放空间,留给到期释放等机制释放. 2 加倍扩容.在需要空间达1M之前按新空间两倍分配空间,否则按新空间大小+1M分配.注意,1M=1024*1024*Char.Char可 ...

  9. DRF 序列化组件 模型层中参数补充

    一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...

  10. hdu1213 并查集板子

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...