Flask 教程,第八部分:关注、联系人和好友 已翻译 100%

oschina 投递于 2012/12/28 09:35 (共 41 段, 翻译完成于 03-14)
阅读 13571
收藏 12
3
加载中

这是我用 Python 的轻量级框架 Flask 编写web程序时的一些经验,我将它记录在此,本篇是一系列文章中的第八篇。

这系列教程的目的是开发一个功能完善的,但没有创意的微博应用,我决定称之为微博客。

下面是这个系列中已经发布的文章的目录:

se77en
翻译于 2013/01/29 12:27
1

简要

我们的微博客正在一点一点的成长,到目前为止我们已经接触了很大一部分我们必须要在应用中实现的主题。

今天我们接着在数据库上面做文章。我们应用中不同的用户可以选择他想关注的其他用户,所以数据库必须记录谁关注了谁。所有社交化应用都有这个功能。只是它们叫不同的名字而已,比如关注,粉丝,朋友,伙伴,慕名崇拜者等等。其他一些网站用这个想法来实现被允许和被禁止的用户列表。我们将称它为关注,但不管名字是神马,实现是一样的。

se77en
翻译于 2013/01/29 12:38
1

设计“关注”功能

在编码之前,让我们想想我们想要从这个功能中获取什么。

让我们从最明显的开始,我们希望我们的用户能简单的维护粉丝名单。

从另一面看,我们希望不同的用户互相知道这个粉丝名单。

我们也希望能有一个方法去查询是否一个用户正在关注谁,或者被谁关注。

用户将电机其他用户个人页面的“关注”按钮来关注其他用户。同样的,他们也可以点击“取消关注”按钮来停止关注一个用户。

最后一点需要的是我们可以轻松从数据库为给定用户的粉丝查询所有微博文章。

所以,如果你认为这是一个快速简单的文章,再想想吧。

se77en
翻译于 2013/01/29 12:51
1

数据库关联

我说过我们希望得到所有用户的关注列表和粉丝列表。不幸的是,关系型数据库没有list属性的字段,我们只有记录表和这些记录之间的联系。

我们已经在数据库中有了一张表来记录用户,我们还没做的是提出一个适当的关系类型来模拟关注/粉丝链接。现在是时候复习一下三种数据库关系类型了。

se77en
翻译于 2013/01/29 12:57
1

One-to-many(一对多)

我们已经在之前的数据库章节中看到过了一对多的关系类型。这儿有个图解:

这个关系类型中,两个实体users和posts关联。我们说一个用户可以有很多条微博,而一条固定微博只能是由一个用户发的。在数据库中这种关系类型通过在“多”的一方添加“一”的一方的外键来表示。在上面的例子中外键就是将user_id添加到posts表中。这个字段标明了不同微博和它在用户表中用户的关联。

user_id清晰的提供了用户和所发微博的直接关系,但是反过来肿么样呢?让这种关系类型变得更加有用,我们需要获取给定用户的所有微博。结果是posts表中的user_id已经足够回答这个问题,如果数据库有索引那么它将支持更有效率的查询方法例如“当user_id为xxoo是检索所有微博”。

se77en
翻译于 2013/01/29 13:15
1

Many-to-many(多对多)

多对多关系类型有点复杂。比如一个例子,想象一个拥有学生和老师的数据库。我们可说一个学生可以有多个老师,一个老师可以有多个学生。这就像是两个重叠的一对多关系。

这种数据库关系下我们可以查询数据库获得教一个学生的所有老师的列表,以及一个老师的课程下所有学生的列表。但它实现起来比较棘手,它不能通过在已存在的表中增加外键来实现。

想要实现多对多关系需要增加一个叫association的辅助表。这儿有个数据库如何查找学生和老师的例子:

它是轻而易举的,包含两个外键的association表能有效地解决很多类型的查询,例如:

  • 学生S的老师是谁?
  • CC老师的的学生是谁?
  • CC老师有多少学生?
  • 学生S有多少老师?
  • CC老师教学生S吗?
  • 学生S选CC老师的课了吗?

se77en
翻译于 2013/01/29 13:36
1

One-to-one(一对一)

一对一是一对多的特例。表现形式也相似,约束是阻止“多”的一方有超过一个链接到“一”的一方。

在有些情况下,这种关系类型是灰常有用的,它和其他两种关系不同,因为任何时候一个表里的一条数据映射到另一个表中时,它可以证明两个表是否能合并成一个表。

se77en
翻译于 2013/01/29 13:46
1

展现关注和粉丝

从上面的关系中我们很容易就能决定使用多对多关系作为合适的数据关系,因为一个用户可以关注很多用户,一个用户也可以被很多用户关注。但有一点拧巴的是,我们希望展示用户关注其他用户,但我们只有用户这一个角色(不像学生老师有两种角色)。所以我们用什么来当多对多关系中的第二个实体呢?

好吧,第二个实体还是用户。这种一个实体的实例映射到同一个实体的另一个实例的关系被叫做self-referential relationship(自我指涉关系),这正是我们需要的。

se77en
翻译于 2013/01/29 13:54
1

这是我们多对多关系的图解:

follwers表示我们的association表。外键都指向用户表,因为我们是映射用户到用户。这个表中的每个记录代表了一个关注用户和一个被关注用户。就像学生和老师的那个例子,这样的设定也能回答所有关注者和悲观者者之间的问题,简单又灵活。

se77en
翻译于 2013/01/29 14:01
1

数据库模型

稍微改变一下我们的数据库模型。我们从增加followers表开始(file app/models.py):

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)

这是从我们上面的图解中直接翻译的结果。注意我们没有像users和posts表那样说明这个表作为模型。因为这是一个除了外键没有任何数据的辅助表,我们使用Flask-SQLAlchemy中低级的APIs创建这个表而不实用associated模型。

se77en
翻译于 2013/01/29 14:09
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(4)

z
zivers

引用来自“HQNY”的评论

在执行 “flask\Scripts\python db_migrate.py”时,报错:NameError: name 'followers' is not defined,求解啊。。
因为你的folloers的定义写到User类调用的后面了。把 followers = db.table(...)写到Class User(db.Model): ... 前面去就行了。
HQNY
HQNY
在执行 “flask\Scripts\python db_migrate.py”时,报错:NameError: name 'followers' is not defined,求解啊。。
litao6015
litao6015
教程有些老了,而且中间的登陆界面部分代码有误,实现不了功能啊
缪斯的情人
缪斯的情人
到此为止,Flask 教程系列全部翻译完了。共12章节。
返回顶部
顶部