社交web允许用户之间相互联系。

例如:

关注者、好友、联系人、联络人或伙伴。

记录两个用户之间的定向联系,在数据库查询中也要使用这种联系。

一、论数据库关系

一对多关系

数据库使用关系建立记录之间的联系。其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起。实现这种关系,要在“多”这一层加一个外键,指向“一”这一侧,例如下列代码:

class Role(db.Model):__tablename__ = 'roles'

  id = db.Column(db.Integer,primary_key = True)#...users = db.relationship('User', backref='role', lazy='dynamic')class User(UserMixin, db.Model):__tablename__ = 'users'#...role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

其中,users的数据库表中添加了一个外键role_id 指向了roles表的id

大部分的其他关系类型都可以从一对多类型中衍生。

多对一关系从“多”这一侧看,就是一对多关系。一对一关系类型是简化版的一对多关

多对多关系

解决方法是添加第三张表,这个表称为关联表。多对多关系可以分解成原表和关联表之间的两个一对多关系。

用SQLAlchemy实现图中的关系。

registrations = db.Table('registrations',db.Column('student_id', db.Integer,        db.ForeignKey('students.id')),
db.Column('class_id', db.Integer, db.ForeignKey('classes.id'))
)
class Student(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String)classes = db.relationship('Class',secondary=registrations,backref=db.backref('students', lazy='dynamic'),lazy='dynamic')
class Class(db.Model):id = db.Column(db.Integer, primary_key = True)name = db.Column(db.String)            

多对多关系仍使用定义一对多关系的db.relationship() 方法进行定义,但在多对多关系中,必须把secondary 参数设为关联表。多对多关系可以在任何一个类中定义,backref 参数会处理好关系的另一侧。关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表。

自引用关系

如果关系中的两侧都在同一个表中,这种关系称为自引用关系。

高级多对多关系

使用多对多关系时,往往需要存储所联两个实体之间的额外信息。对用户之间的关注来说,可以存储用户关注另一个用户的日期,这样就能按照时间顺序列出所有关注者。这种
信息只能存储在关联表中,但是在之前实现的学生和课程之间的关系中,关联表完全是由SQLAlchemy 掌控的内部表。

为了能在关系中处理自定义的数据,我们必须提升关联表的地位,使其变成程序可访问的模型。

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

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.ForegnKey('users.id'),primary_key = True)timestamp = db.Column(db.DateTime,default = datetime.utcnow)

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

class User(UserMixin, db.Model):
# ...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')            

程序现在要处理两个一对多关系,以便实现多对多关系。由于这些操作经常需要重复执行,所以最好在User 模型中为所有可能的操作定义辅助方法

app/models.py:关注关系的辅助方法

 #关注关系的辅助方法def follow(self,user):if not self.is_following(user):f = Follow(follower=self,followed=user)db.session.add(f)def unfollow(self,user):f = self.followed.filter_by(followed_id = user.id).first()if f:db.session.delete(f)def is_following(self,user):return self.followed.filter_by(follow_id = user.id).first() is not Nonedef is_followed(self,user):return self.followers.filter_by(follow_id = user.id).first() is not None

二、在资料页中显示关注者

app/templates/user.html:在用户资料页上部添加关注信息

{% extends "base.html" %}
{% import "_macros.html" as macros %}{% block title %}微博 - {{ user.username }}{% endblock %}{% block page_content %}
<div class="page-header"><img class="img-rounded profile-thumbnail" src="{{ user.gravatar(size=256) }}"><div class="profile-header"><h1>{{ user.username }}</h1>{% if user.name or user.location %}<p>{% if user.name %}{{ user.name }}<br>{% endif %}{% if user.location %}From <a href="http://maps.google.com/?q={{ user.location }}">{{ user.location }}</a><br>{% endif %}</p>{% endif %}{% if current_user.is_administrator() %}<p><a href="mailto:{{ user.email }}">{{ user.email }}</a></p>{% endif %}{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}<p>创建时间 {{ moment(user.member_since).format('L') }}. 最后访问 {{ moment(user.last_seen).fromNow() }}.</p><p>{{ user.posts.count() }} 博客文章.</p><p>{% if current_user.can(Permission.FOLLOW) and user != current_user %}{% if not current_user.is_following(user) %}<a href="{{ url_for('.follow', username=user.username) }}" class="btn btn-primary">关注</a>{% else %}<a href="{{ url_for('.unfollow', username=user.username) }}" class="btn btn-success">取消关注</a>{% endif %}{% endif %}<a href="{{ url_for('.followers', username=user.username) }}">关注者: <span class="badge">{{ user.followers.count() }}</span></a><a href="{{ url_for('.followed_by', username=user.username) }}">被关注: <span class="badge">{{ user.followed.count() }}</span></a>{% if current_user.is_authenticated and user != current_user and user.is_following(current_user) %}| <span class="label label-default">关注了你</span>{% endif %}</p><p>{% if user == current_user %}<a class="btn btn-default" href="{{ url_for('.edit_profile') }}">编辑个人资料</a>{% endif %}{% if current_user.is_administrator() %}<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin', id=user.id) }}">编辑个人资料 [管理员]</a>{% endif %}</p></div>
</div>
<h3>Posts by {{ user.username }}</h3>
{% include '_posts.html' %}
{% if pagination %}
<div class="pagination">{{ macros.pagination_widget(pagination, '.user', username=user.username) }}
</div>
{% endif %}
{% endblock %}

转载于:https://www.cnblogs.com/zuoshoushizi/p/7494188.html

基于python的web应用开发-添加关注者相关推荐

  1. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(下)

    目录 前言 第8章 用户认证 第9章 用户角色 第10章 用户资料 第11章 博客文章 第12章 关注者 第13章 用户评论 第14章 应用编程接口   前言 第1章-第7章学习实践记录请参见:< ...

  2. Flask Web开发:基于Python的Web应用开发实战

    <Flask Web开发:基于Python的Web应用开发实战> 虽然简单的网站(Flask+Python+SAE)已经上线,但只是入门.开发大型网站,系统地学习一遍还是有必要的. 201 ...

  3. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉还是 ...

  4. 学习《Flask Web开发:基于Python的Web应用开发实战》分享

    学习<Flask Web开发:基于Python的Web应用开发实战>分享一直在说学习Python,对同事,对朋友,都说我正在学习Python,这无形给自己一定的压力,促使自己要去学习,进步 ...

  5. 《FlaskWeb开发:基于Python的Web应用开发实战》笔记

    开源库的cdn加速 可以在这里直接搜索复制script链接 https://www.bootcdn.cn/ requirements.txt文件的生成与使用 生成requirements文件:$ pi ...

  6. 《Flask Web开发:基于Python的Web应用开发实战》笔记(原创)

    内容提要 在学习"狗书"<Flask Web开发:基于Python的Web应用开发实战>的过程中,一直遇到各种各样的坑.该书的第一部分是"Flask简介&qu ...

  7. flask web开发:基于python的web应用开发实战_在知乎上学 Python Web 开发篇

    通知: 1. 最近我们将进行2期学习小组,面向完全零基础的Python入门学习小组已经开始,第一次任务的讨论将于明晚(15号)进行,现在上车还来得及 2. 另有一期数据可视化小组将于年前启动,第一次讨 ...

  8. 基于python的网站开发-FlaskWeb开发:基于Python的Web应用开发实战 pdf下载

    这大概是入门Flask最最经典的教材了.可是我依然看得很吃力,我的自控力啊啊~到哪里去了 讲的挺全面挺系统 有的地方需要硬肯 不过好在指明了方向 比较贴近现在流行的开发模式 这两天写了一个小博客应用 ...

  9. 基于Python的Web应用开发实战——3 模板

    要想开发出易于维护的程序,关键在于编写形式简洁且结构良好的代码. 当目前为止,你看到的示例都太简单,无法说明这一点,但Flask视图函数的两个完全独立的作用却被融合在了一起,这就产生了一个问题. 视图 ...

最新文章

  1. PCL:点云特征描述子3D_object_recognition_(descriptors)
  2. 解决Lodop 8443端口找不到CLodopfuncs.js文件问题
  3. 获取指定包名下的所有类
  4. 要做PPT,一直找不到资源?
  5. 结对开发 随机产生数组并求最大子数组的和
  6. 从RGB扫描图到数字化等高线矢量图
  7. 安卓开发之Toast(吐司)应用
  8. java对象序列化为字符串
  9. Node实现的异步I/O
  10. 参考阿里云DMS快速开发数据管理平台
  11. 免费python自学攻略-Python自学攻略
  12. 回顾一个考务系统的开发
  13. 第二章 算法——程序的灵魂
  14. 基于EEMD和樽海鞘算法优化SVM的滚动轴承故障诊断python
  15. 地图编辑器到底是做什么的?今天之后你会对此有个新的了解
  16. w3af 安装并配置桌面和快速启动栏
  17. ai python 自动_Python - AI自动抠图
  18. 服务器虚拟地址是,两台服务器对外虚拟地址
  19. 常用的计算机技术博客,计算机常用命令!
  20. 四个穴位掌控全身健康

热门文章

  1. 2012,新的一年,新的开始
  2. 7-87 吉老师的回归 (15 分)
  3. 没串口怎么操作核心板的Linux?ADB(以点灯为例)
  4. nmealib linux编译,nmealib的使用可以缩短GPS的开发周期
  5. 中标麒麟共享win7打印机_Win7系统添加网络共享打印机
  6. Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作...
  7. JavaScript基础---匿名函数
  8. BZOJ 2648 SJY摆棋子(KD-Tree)
  9. 递归 - 求数字/字符串的全排列
  10. Ubuntu ./configure 半途终止 导致没有生成makefile文件 解决方法