Flask 学习 十一 关注着

数据库关系

1.1多对多关系

添加第三张表(关联表),多对多关系可以分解成原表和关联表之间的两个一对多的关系

多对多仍然使用db.relationship()方法定义,但是secondary参数必须设定为关联表,多对多关系可以在任何一个表中定义,backref参数会处理好关系的另一侧

1.2 自引用关系

如果关系中的两侧都在同一个表中称为自引用关系,在关注中,关系的左侧是用户实体,为关注着,关系的右侧也是用户实体,但是被关注着

本例的关联表是 follows,其中每一行都表示一个用户关注了另一个用户。图中左边表示的一对多关系把用户和 follows 表中的一组记录联系起来,用户是关注者。图中右边表示的一对多关系把用户和 follows 表中的一组记录联系起来,用户是被关注者。

1.3 高级多对多关系

在多对多关系中需要存储实体之间的额外信息,用户之间的关注可以把时间信息存储在关联表中

app/models.py/Follow 关注关联表模型的实现

class Follow(db.Model):
    __tablename__ = ‘follows‘
    follower_id = db.Column(db.Integer,db.ForeignKey(‘users.id‘),primary_key=True)
    followed_id = db.Column(db.Integer, db.ForeignKey(‘users.id‘), primary_key=True)
    timestamp=db.Column(db.DateTime,default=datetime.utcnow)

app/models.py/User 使用两个一对多关系实现的多对多关系

class User(UserMixin,db.Model):   。。。。
   # 为了消除外键间的歧义,定义关系时使用foreign_keys指定外键
    # db.backref指的是回引Follow模型,lazy=‘joined‘可以实现立即一次性完成从连结查询中加载相关对象
    # 如果把joined换成select就会成倍增加数据库查询次数
    # lazy=‘dynamic‘ 直接返回查询对象,可以在执行查询之前添加过滤器
    # cascade 参数配置在父对象上执行的操作对相关对象的影响
    # 层叠选项可设定添加用户到数据库会话中,自动把所有的关系对象添加到会话中
    # delete-orphan的作用是把默认层叠行为(把对象联结的所有相关对象的外键设为空值),变成删除记录后把指向该记录的实体也删除,这样就有效的销毁的联结
    # ‘all,delete-orphan‘是逗号分隔的层叠选项,表示启用所有默认层叠选项并删除关联记录,all表示除了delete-orphan之外的所有层叠选项,
    followed=db.relationship(‘Follow‘,foreign_keys=[Follow.follower_id],
                             backref=db.backref(‘follower‘,lazy=‘joined‘),
                             lazy=‘dynamic‘,
                             cascade=‘all,delete-orphan‘)
    followers = db.relationship(‘Follow‘, foreign_keys=[Follow.followed_id],
                               backref=db.backref(‘followed‘, lazy=‘joined‘),
                               lazy=‘dynamic‘,
                               cascade=‘all,delete-orphan‘)

app/models.py/User 定义关注关系的辅助方法

class User(UserMixin,db.Model):  。。。
    def follow(self,user):
        if not self.is_following(user):
            # 把关注着和被关注着联结在一起传入构造器并添加到数据库中
            f = Follow(follower=self,followed=user)
            db.session.add(f)

    def unfollow(self,user):
        # followed找到联结用户和被关注用户的实例
        f = self.followed.filter_by(followed_id=user.id).first()
        if f :
            # 销毁用户之间的联结,删除这个对象即可
            db.session.delete(f)

    def is_following(self,user):
        # 搜索两边指定的用户,如果找到返回True
        return self.followed.filter_by(followed_id=user.id).first() is not None

    def is_followed_by(self,user):
        # 搜索两边指定的用户,如果找到返回True
        return self.followers.filter_by(follower_id=user.id).first() is not None
时间: 2024-11-09 07:34:14

Flask 学习 十一 关注着的相关文章

Flask学习之八 关注、联系人和好友

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-viii-followers-contacts-and-friends 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/followers.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-viii-f

Flask 学习(四)静态文件

Flask 学习(四)静态文件 动态 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件.理想情况下你的服务器已经配置好提供静态文件的服务. 在开发过程中, Flask 也能做好这个工作. 静态文件引用 我们先来看下普通的 html 引用静态文件,如 css(js也同样,就不多加示例了),以下为一简单实例,直接打开html: flask 处理 —— static 若直接将该html 当成 flask 模板,相对路径自然就失效了,静态文件将不会被成功读取. 那在flask中

Oracle学习(十一):PL/SQL

1.知识点:可以对照下面的录屏进行阅读 PL/SQL程序结构 declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; / ------------------------------------------------------------------ --第一个PL/SQL程序:HelloWorld set serveroutput on --如果要在屏幕上输出信息,需要将serveroutput开关打

springMVC3学习(十一)--文件上传CommonsMultipartFile

使用springMVC提供的CommonsMultipartFile类进行读取文件 需要用到上传文件的两个jar包 commons-logging.jar.commons-io-xxx.jar 1.在spring配置文件中配置文件上传解析器 <!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipar

[ZHUAN]Flask学习记录之Flask-SQLAlchemy

From: http://www.cnblogs.com/agmcs/p/4445583.html Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令. Flask-Migrate 是一个数据迁移框架,需要通过Flask-script库来操作. 一.配置Flask-SQLAlchemy 程序使用的数据库地址需要配置在SQLALCHEMY_DATABASE_URI中,SQLALch

Flask 学习(一)概述及安装

Flask 概述及安装 Flask 简介 Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 官方网址 :http://flask.pocoo.org/ 了解 Flask:首先,Flask 是Python 的一个Web 应用框架:其次,它是“微型”的 . 比起同类现有的web框架(如:Django),Flask 并不包含数据库抽象层,表单验证等.Flask 旨在保持代码简洁且易于扩展(Flask源码十

Flask学习之五 用户登录

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/userlogin.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-v-user-logins 备注:我是三个一起看的,有些

Flask学习之六 个人资料和头像

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/profile.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-vi-profile-page-

Flask学习-Wsgiref库

一.前言 前面在Flask学习-Flask基础之WSGI中提到了WerkZeug,我们知道,WerkZeug是一个支持WSGI协议的Server,其实还有很多其他支持WSGI协议的Server.http://wsgi.readthedocs.io/en/latest/servers.html,这里可以看到有uwsgi.werkzeug.serving.wsgiref.python-fastcgi等等几十个.wsgiref是官方给出的一个实现了WSGI标准用于演示用的简单Python内置库,它实现