class Tweet(db.Model):
tablename = ‘tweets’
…
user_id = db.Column(db.Integer, db.ForeignKey(‘users.id’))
class User(db.Model):
tablename = ‘users’
…
tweets = db.relationship(‘Tweet’, backref=’user’)
定义两个类,一个推特有一个发推特的用户,一个用户会发多个推特,所以要把推特和用户关联起来。
推特类的模型设计:
推特需要知道是谁发的,所以定义一个user_id字段,用来保存user的id,这个字段就是外键,用来关联推特类和用户类
传给db.ForeignKey()的 ‘users.id’ 参数,就是表示user_id这个字段为user.id的值,通过user_id就可以查询这是由哪个id发的推特。
用户类的模型设计:
tweets = db.relationship(‘Tweet’, backref=’user’)
relationship表明它不是一个字段,而是User类的一个属性,user类表中没有tweets这个字段,db.relationship()中第一个参数 ‘Tweets’ 是类名,表示关系的另一端是Tweets类,对于一个User类的实例(某一个用户),调用tweets属性,将根据该用户的ID(对应tweets类里面的user_id字段)查询并返回所有推特。
db.relationship() 中的 backref 反向应用表示向Tweet类模型添加一个user属性,来实现反向引用,这一属性和 user_id 都可以访问 User 模型, 不同的是前者获取的是类模型实例对象, 而后者获取的是外键的值。
假设:
u = User()
t = Tweet()
u 的 username 是 ‘xd’ , u 的 id 是 3
用户’xd’ 发了10条推特
t 是 ‘xd’ 发的第5条推特, 内容是’666’
那么:
u.tweets 将以列表形式返回用户 ‘xd’ 的10条推特
t.content 将返回 '666'
t.user_id 将返回这条推特的用户的 id 也就是3, 但并不知道发推用户的名字
t.user 将返回这条推特的用户实例 u, t.user.username 就可以获得用户的名字