[ SQLAlchemy ] 关于dynamic的“一知半解”
问题提出:
1.粉丝机制
2.评论的点赞功能
这两个功能分别由User类和Comment类来实现,同样定义了多对多的关系,查询的时候用的方法却大不一样,先看看代码吧。
###
# User类的中间表
followers = db.Table(
'followers',
db.Column('follower_id', db.Integer, db.ForeignKey('users.id')),
db.Column('followed_id', db.Integer, db.ForeignKey('users.id')),
db.Column('timestamp', db.DateTime, default=datetime.utcnow)
) # Comment类的中间表
comments_likes = db.Table(
'comments_likes',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('comment_id', db.Integer, db.ForeignKey('comments.id')),
db.Column('timestamp', db.DateTime, default=datetime.utcnow)
)
### class User(PaginatedAPIMixin, db.Model):
...
# followeds 是该用户关注了哪些用户列表
# followers 是该用户的粉丝列表
followeds = db.relationship(
'User', secondary=followers,
primaryjoin=(followers.c.follower_id == id),
secondaryjoin=(followers.c.followed_id == id),
backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')
def is_following(self,user):
'''
判断有没有关注 user 这个用户
'''
return self.followeds.filter(followers.c.followed_id == user.id).count()>0 class Comment(PaginatedAPIMixin, db.Model):
__tablename__ = 'comments'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
...
likers = db.relationship(
'User',
secondary=comments_likes,
backref=db.backref('liked_comments',lazy='dynamic')
)
def is_liked_by(self, user):
'''
判断用户 user 是否已经对该评论点过赞
'''
return user in self.likers
从上面的代码看出,同样是多对多的关系
为何User类中高亮部分的followeds是可查询的对象

而Comment类中高亮部分的likers是列表呢?

原因分析
1.先看User类中定义的followeds,正向查询(使用user.followeds)的时候会用到 lazy='dynamic' ,反向查询(使用user.followers)的时候同样也会用到。
2.再看Comment类中定义的likers,只有反向查询的时候才会用到 lazy='dynamic'
所以说,关键在于是否用到 lazy='dynamic' 。
查看flask-SQLAlchemy文档http://www.pythondoc.com/flask-sqlalchemy/models.html#one-to-many :
'dynamic' 在有多条数据的时候是特别有用的。不是直接加载这些数据,SQLAlchemy 会返回一个查询对象,在加载数据前您可以过滤(提取)它们。
[ SQLAlchemy ] 关于dynamic的“一知半解”的更多相关文章
- SQLALchemy中关于复杂关系表模型的映射处理
映射在第五步,我们还是一步一步来哈 一. 关系介绍 举一个比较经典的关系,部门与员工(以下是我的需求情况,算是把该有的关系都涉及到了) 1.每个部门会有很多成员(这里排除一个成员属于多个部门的情况) ...
- 13、Flask实战第13天:SQLAlchemy操作MySQL数据库
安装MySQL 在MySQL官网下载win版MySQL 双击运行 后面根据提示设置密码然后启动即可,这里我设置的密码是:123456 我们可以通过Navicat客户端工具连接上MySQL addres ...
- SQLAlchemy04 /SQLAlchemy查询高级
SQLAlchemy04 /SQLAlchemy查询高级 目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_ ...
- SQLAlchemy(四):SQLAlchemy查询高级
目录 SQLAlchemy04 /SQLAlchemy查询高级 1.排序 2.limit.offset和切片操作 3.懒加载 4.group_by 5.having 6.join 7.subquery ...
- Python学习笔记2-flask-sqlalchemy 简单笔记
flask-sqlalchemy 简单笔记 字数 阅读 评论 喜欢 flask-sqlalchemy SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架, ...
- Flask-论坛开发-3-数据库
对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. SQLAlchemy ...
- Flask 源代码阅读笔记
我认为我已经养成了一个坏习惯.在使用一个框架过程中对它的内部原理非常感兴趣,有时候须要花不少精力才 明确,这也导致了学习的缓慢,但换来的是对框架的内部机理的熟悉,正如侯捷所说,源代码面前,了无秘密.这 ...
- flask_sqlalchemy介绍
快速入门 Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展.有关完整的指南,请参阅 SQLAlchemy 的 API 文档. 一个最小应用 常见情 ...
- Flask中的ORM使用
前言 ORM拓展 安装 数据库设置 使用 关系 单表操作 建表 应用表结构 CRUD 添加查找操作 更新操作 删除操作 一对多 多对多 总结 前言 最近几天接触了一下Flask,在惊叹于其简洁性的同时 ...
随机推荐
- 关于for与forEach遍历集合中对集合进行操作的问题
遍历List集合,在循环中再对List集合进行操作,有时候会遇到ConcurrentModificationException(并发修改异常);其实只有在forEach循环集合再对集合操作会发生异常: ...
- linux系统下命令的学习
本博客是本人工作时做的笔记 ps aux |grep ^profile |grep A190200024 ^ 表示行首匹配 linux查看文件大小: 具体可查看:https://www.cnblogs ...
- JSP中声明变量、方法
在JSP页面中声明局部变量,全局变量,方法等 代码示例: <%@ page language="java" contentType="text/html; char ...
- C#编程概述(摘抄)
C#编程概述 一个简单的C#程序 标识符 标识符是一种字符串,用来命名变量.方法.参数和许多后面将要阐述的其他程序结构. 关键字 所有C#关键字都由小写字母组成,但是.NET类型名使用Pascal大小 ...
- 【antd】如何自定义antd组件form表单中Form.Item里的内容组件
需求:现有一个form表单,但是其中一个元素比较复杂,并不是简单的输入框或者下拉框之类的.但是我又希望能通过form.validateFields().then()去获得它的值,就不需要在当前页面写大 ...
- 静态类中不可以使用$this
//静态方法中不能使用$this,静态方法调用其他方法可以用static\self\类名来代替class ceshi{ static public function aa(){ static::bb( ...
- Windows异常分发
当有异常发生时,CPU会通过IDT表找到异常处理函数,即内核中的KiTrapXX系列函数,然后转去执行.但是,KiTrapXX函数通常只是对异常做简单的表征和描述,为了支持调试和软件自己定义的异常处理 ...
- Table.RowCount行列计数…Count(Power Query 之 M 语言)
数据源: 任意五行两列 目标: 计算行数(包括空行) 操作过程: [转换]>[对行进行计数] M公式: = Table.RowCount( 表 ) 扩展: 对表中列进行计数:= Table.C ...
- 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1
本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...
- Java应用日志如何与Jaeger的trace关联
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...