relationship的理解和使用


网上看到关于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 可以写在多的那一方, 也可以写在一的那一方。
但是不能两边都写, 这样会报错的


文章作者: 陌上人如玉
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陌上人如玉 !
  目录