在modle中创建两个模型表

class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
u_name = db.Column(db.String(10), unique=True)
posts = db.relationship('Dongtai',backref='user',lazy='dynamic') class Dongtai(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
body = db.Column(db.String(140),unique=True)
u_id = db.Column(db.Integer,db.ForeignKey('user.id'))

分别是用户和动态模型

之间进行了关联     注意进行关联需要外链配合使用,只有一边进行关联会出错


一对多

一般来说自己做查询操作,比如我想要知道一个用户发的动态,那么需要先查询用户信息,然后通过用户信息查询用户的动态

但是flask-sqlalchemy通过一个关联属性可以只需要查询用户即可得到所发的动态

@app.route('/xxx/')
def get_query():
# 其他属性也行 id
u = User.query.filter(u_name="查询的用户").first()
bodys = u.posts return render_template('xxxx.html',bodys=bodys) # 网页渲染
{% for body in bodys %}
{{ body.body }}<br>
{{ body.u_id }}<br>
{% endfor %}

多对一

多对一的查询由于有了反向代理

relationship('Dongtai',backref='user',lazy='dynamic')

可以通过

d = Dongtai.query.first()
print(d.user.u_name)

直接询问动态模型进行查询,通过

ralationship("Dongtai",backref='user',lazy='dynamic')

# 注意反向代理的backref 名称

通过反向关联的名称表可以得到user表中的属性




更新一下,

增加两个模型作为添加数据实验

python manage.py shell 

# 进入shell 模式 进行数据添加

导入模型和db

在已有的用户数据中提取一个id为3的

做一个用户动态的实例

这里貌似有一个坑点,不知道其他人和我相同不? 

你不能直接 p.user_id = u  用户实例   必须要使用 u.id 才能在之后的commit()中保存,不然会出现以下错误

db.session.add(p)

db.session.commit()   保存即可,在数据库中post表中存在数据

当然除了这个还有另一种,比如在 用一个用户实例  u

使用关系 进行append 添加 p1动态   p1的user_id 则设置为u实例的 id 3

在将 动态p1 加入数据库 保存

数据库中也能显示出   post表 user_id为3的动态


如果需要查看用户所拥有的post,因为在用户表中设置了关联,所以使用 以下进行查看 ,但是注意,因为关联表中设置了 lazy = 'dynamic' 懒加载

前一份u.posts 是指一个对象basequery,还可以对该对象进行一个筛选  比如我在动态表中存储了2条用户id为3的数据

通过筛选动态表中动态id为13的动态, 发现还是属于basequery的对象,还能进行下一步操作

得到一个用户动态的实例 13

如果查看该实例的body属性   根据上面的操作.body

后面一个这是直接将上一个对象进行一个数据加载  变为放在内存中的数据

all 是所有数据,所以需要进行一个循环遍历

for i in u.posts.all():
i.body

如果是first() 则不需要遍历     直接body

flask 模型一对多个人理解的更多相关文章

  1. 后盾网lavarel视频项目---模型一对多关联简单实例

    后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...

  2. Flask 模型操作

    ORM 简称 ORM, O/RM, O/R Mapping 持久化模型 特征 数据表和编程类的映射 数据类型映射 字段属性映射类的属性和数据类型 关系映射 表于表之间的关系对应到 编程类的关系上 优点 ...

  3. 深度|OpenAI 首批研究成果聚焦无监督学习,生成模型如何高效的理解世界(附论文)

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载,原文. 选自 Open AI 作者:ANDREJ KARPATHY, PIETER ABBEEL, GREG BRO ...

  4. 对Java内存模型即JMM的理解

    类似物理上的计算机系统,Java虚拟机规范中也定义了一种Java内存模型,即Java Memory Model(JMM),来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能 ...

  5. 从GO内存模型与调用协议理解defer closure的坑

    资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...

  6. 关于THINKPHP5模型关联的初步理解

    初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则 ...

  7. Java内存模型解惑--观深入理解Java内存模型系列文章有感(二)

    1.volatile关键字修饰的域的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用 ...

  8. CORS跨域模型浅析及常见理解误区分析

    CORS跨域资源共享是前后端跨域十分常用的一种方案,主要依赖Access-Control-Allow(ACA)系列header来实现一种协商性的跨域交互. 基本模型 其中的具体流程大致可以分为以下几步 ...

  9. 用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性

    网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以用日常生活中的常见事物——盒子作一 ...

随机推荐

  1. Qt platform plugin 'windows' 问题的解决方法

    关于Qt 发布程序时遇到qt platform plugin ‘windows’问题的解决方法如下  遇到这个问题,一般应该已经把一部分dll拷贝到了发布的可执行文件同级目录, 我是直接添加C:\Qt ...

  2. mysql数据库-基础--长期维护

    ###############    数据库    ############## 主要是通过这个学习到什么? 1,库的操作 2,表的操作,包括查询,多表查询,子查询 3,视图,事务,索引,锁, ### ...

  3. 错误修改.bashrc文件导致所有命令无法使用解决方法

    export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

  4. u盘出现大文件无法复制的解决

    如果u盘出现大文件无法复制的情况,修改U盘的文件系统格式: 把U盘格式化为NTFS格式.  FAT32的都不能放4G+的文件;右键格式化里如果没有NTFS,就在开始运行里输入cmd 然后输入" ...

  5. python3之urllib代理池

    1.常见状态吗 301:重定向到新的URL,永久性302:重定向到临时URL,非永久性304:请求的资源未更新400:非法请求401:请求未经授权403:禁止访问404:没找到对应页面500:服务器内 ...

  6. js 实现手风琴

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. flask_admin+flask_login 整合,jieba分词+echarts数据分析可视化

    项目地址: https://github.com/WES6/list

  8. Eclipse如何打开Android工程

    一.Eclipse如何打开Android工程 1.你可以在file->new->other->android object选择选项:create object from exists ...

  9. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  10. Java基础IO流 ,文件读取,由易至难

    最基础的读取文件 import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;imp ...