网上看到关于relationship的讲解, 很多都讲的含糊不清, 我今天琢磨了一天,算是弄明白了。本篇文章主要讲述relationship一对多的使用。
relationship 是什么
是python web框架的flask 中, SQLAlchemy这个第三方库的一个api, 作用是实现模型和模型之间一对多关系的关联(仅是模型之间的关联,不延伸到数据库中)
一对多的关系
什么是一对多呢?现实中的举例是,一个人有十个手指头,一个淘宝账号可以购买多个订单。 这种就是一对多的关系。
relationship 的使用
模型类之间进行关联
这个relationship 就是虚拟主键, 实现一对多关系会很方便, relationship 一般和外键约束搭配使用
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
article_name = db.Column(db.String(20), nullable=False)
# TypeError: column() got an unexpected keyword argument 'nullable'
# 是因为article_text = db.column(db.String(500), nullable=False) 这里写了小写的c , 应该是大写的
article_text = db.Column(db.String(500), nullable=False)
create_time = db.Column(db.DateTime, default=datetime.now)
# 外键约束, 记录文章是哪个用户发表的
uid = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def __str__(self):
return self.article_name
class User(db.Model):
"""
"""
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(15), nullable=False)
password = db.Column(db.String(128), nullable=False)
phone = db.Column(db.String(11), unique=True)
email = db.Column(db.String(20))
rdatetime = db.Column(db.DateTime, default=datetime.now)
isDelete = db.Column(db.Integer, default=0)
# 给 Article 模型插入了一个 user 属性
article = db.relationship('Article', backref='user')
def __str__(self):
return self.username
以上是模型中的关联, 如果单纯是这样看, 还是看不出,那么下面我就结合视图函数和模板进行使用
外键约束在视图函数中进行处理
在视图函数这层, 添加文章数据的时候, 要存入对应外键约束的值
relationship的正向解析
这个属性, 是 用户模型里的属性, 一个用户可以有多个文章, 所以 user.article 会拿到多个 文章对象。
这个就是正向解析, 对象.属性 。 但是这里通过 relationship 实现了类似 联表查询的作用
这里就可以看到用户有两个, 一个用户发布两篇文章,一个用户发表一章
relationship的反向解析
通过反向解析, 拿到一对多的 一, 然后取一 的属性值
这样子,直接在 文章模型类里就能反向解析到 用户模型类的属性
数据库里的数据
这样对比一下, 就很直观了
特别注意事项
这个relationship 可以写在多的那一方, 也可以写在一的那一方。
但是不能两边都写, 这样会报错的