flask -model 理解数据库表之间的关系

主要理解多张数据库表的关系。

明确:一个项目肯定会有多张表,确定表与表之间的关系最重要。
在开始项目前必须要确定表与表的关系

单独一张表: User 是不行的。user要与其他的建立联系。

以student和班级clazz为例:
一个班级是有多名学生的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiCYiwTF-1605330883507)(/Users/running/Desktop/屏幕快照 2020-05-26 下午12.39.04.png)]

如果是sql语句:

  1. 查询python01班级的学生

    select * from student where 班级=select id from clazz where 班级名=‘python01’)
    或者
    select * from student inner join clazz on student.班级=clazz.id where clazz.班级名='python01' 
    
  2. 查询xiaowang所在的班级名

    select 班级名 from clazz where id= (select 班级 from student where name='xiaowang')
    或者
    select 班级名 from student inner join clazz on student.班级=clazz.id where name='xiaowang'
    

但是体现在python框架中不方便直接写表连接查询和子查询。python框架为了简化多表的查询,制定了多表的关系:

  1. 1对多

    常见的比如:班级对学生,部门对员工,学校对班级,用户对文章,用户对订单

    可以说一个班级有多名同学或者一个部门有多名员工,但是不能说:

    一一个员工属于多个部门,一个班级属于多个学校…

    在flask的框架中如何体现1对多的模型关系?

    就是通过外键ForignKey和relationship体现。ForignKey是给映射关系说的,relationship是给模板使用的。

    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(64), nullable=False)
        phone = db.Column(db.String(11), unique=True, nullable=False)
        email = db.Column(db.String(30))
        icon = db.Column(db.String(100))
        isdelete = db.Column(db.Boolean, default=False)
        rdatetime = db.Column(db.DateTime, default=datetime.now)
        # 增加一个字段
        articles = db.relationship('Article', backref='user')
        #
        def __str__(self):
            return self.username
    
    from datetime import datetime
    
    from exts import db
    
    
    class Article(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        title = db.Column(db.String(50), nullable=False)
        content = db.Column(db.Text, nullable=False)
        pdatetime = db.Column(db.DateTime, default=datetime.now)
        click_num = db.Column(db.Integer, default=0)
        save_num = db.Column(db.Integer, default=0)
        love_num = db.Column(db.Integer, default=0)
        # 外键 同步到数据库的外键关系
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    
    
  2. 多对多

    常见的多对多:用户对文章评论,用户对商品,学生对课程

    一个用户可以买多个商品,反过来这个个学生属于多个班级,商品的还可以让多个用户购买

    用户 1 -----》 n 商品
    n 《----- 1

    一个学生可以选择多门课程,反过来一门课程还可以让多个学生选择

    tags = db.Table('tags',
        db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
        db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
    )
    
    class Page(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        tags = db.relationship('Tag', secondary=tags,
            backref=db.backref('pages', lazy='dynamic'))
    
    class Tag(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(20),nullable=False)
    

或者

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary='Page_tag',
        backref='pages')

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20),nullable=False)
    
class Page_tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))

大家可以尝试分析:
微信中可能涉及的表以及关系。 比如: 用户与好友之间的关系???
订票网站中: 电影与用户的关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值