2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型

2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型,第1张

2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型

项目地址:https://codechina.csdn.net/sabian2/myflask.git
这节是模型 *** 作

1:N的模型 *** 作 创建模型

在user_model.py创建两个模型类:用户模型和卡模型
db是flask的SQLAlchemy对象,在模块init文件中已定义

from models import db

#用户模型
class UserModel(db.Model):
    #主键
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    #普通字段
    name=db.Column(db.String(30),nullable=False,comment='姓名')
    auth_key = db.Column(db.String(100),nullable=False,comment='密码')
    phone=db.Column(db.String(11),unique=True,comment='电话')


#用户的卡包模型
class CardModel(db.Model):
    #主键
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    #普通字段
    publisher=db.Column(db.String(30),nullable=False,comment='发行商')
    number=db.Column(db.String(40),nullable=False,comment='卡号')
    money=db.Column(db.Float,nullable=False,comment='余额',default=0)
    #外键
    user_id=db.Column(db.Integer,db.ForeignKey('user.id'),nullable=True,comment='用户的id')

    #模型的反向引用
    user=db.relationship('UserModel',backref=db.backref('cards',lazy=True))


模型间关系

这两个模型的关系是1:N的外键关系,一般在多端建立关系

	user_id=db.Column(db.Integer,db.ForeignKey('user_model.id'),nullable=True,comment='用户的id')

    #模型的反向引用
    user=db.relationship('UserModel',backref=db.backref('cards',lazy=True))

在多端表 设置外键字段user_id,并建立反向引用关系

*** 作模型CRUD 模型添加数据

首先启动初始化数据库的视图,这里在前面的章节定义了user/login路由是这个功能,后面新建test模块,在测试函数中做 *** 作
app.app_context().push():提取环境数据

db.session.add:添加模型数据
db.session.commit():确认数据并进行提交

为用户模型新增一条数据
from unittest import TestCase
from mainapp import app
from models import db
from models.user_model import UserModel, CardModel


class TestUser(TestCase):
    def test_add(self):
        app.app_context().push()
        user=UserModel()
        user.name='li'
        user.auth_key='dsadas'
        user.phone='31231233131'
        db.session.add(user)
        print(user.name)
        db.session.commit()

给用户1增加卡信息
    def test_waijianguanxi(self):
        app.app_context().push()
        user=UserModel.query.get(1)
        print(user.name)
        print(user.cards)
        card=CardModel()
        card.number='131230293023903902390923021'
        card.money=0
        card.publisher='健身房'
        db.session.add(card)
        user.cards.append(card)
        db.session.commit()

测试结果

数据库结果

可以看到,经过

        user.cards.append(card)

card_model表中外键已经取得了用户1的id

一次增加多个数据

db.session.add_all(li)使用这个函数来添加多个

    def test_addmany(self):
        app.app_context().push()
        li=[]
        for i in range(10):
            user=UserModel()
            user.phone='123123213'+str(i)
            user.name='dsd'+str(i)
            user.auth_key='dsafafjiaj'+str(i)
            li.append(user)
        db.session.add_all(li)
        db.session.commit()

查询数据

查询是删除和修改的基础 *** 作

用模型类查询

查询的 *** 作符参照这一篇

    def test_query1(self):
        app.app_context().push()

        user=UserModel.query.get(1)
        print(user.name)

        user2=UserModel.query.filter(UserModel.name.like('dsd%'))
        # print(user2[0].name)
        for i in user2:
            print(i.id,i.name)

UserModel.query.get(1)
根据主键的值查询,获取的是一条数据
UserModel.query.filter(UserModel.name.like(‘dsd%’))

根据查询条件获取,获取的是一个列表

用db.session查询

db.session.query(UserModel):查询整个模型,相当于select * from ,后面跟链式 *** 作
db.session.query(UserModel.name,UserModel.phone):查询指定字段,取得的内容不具有其他字段,相当于select指定字段
order_by(),根据指定字段排序
limit(3):限制结果数

    def test_query2(self):
        app.app_context().push()
        user=db.session.query(UserModel).all()
        for i in user:
            print(i.name,i.id)

        user=db.session.query(UserModel.name,UserModel.phone).order_by(UserModel.phone).limit(3)
        for i in user:
            print(i.name,i.phone)
        

查询结果

修改数据

原数据

修改语句

    def test_update(self):

        app.app_context().push()

        user=UserModel.query.get(1)
        user.name='AAA'
        user.phone='213231312'
        user.auth_key='asdsdjasidnio'
        db.session.commit()

修改后的数据库数据

删除数据

删除前数据库

删除语句

    def testremove(self):

        app.app_context().push()

        user=UserModel.query.get(2)
        print(user.name,user.phone)
        db.session.delete(user)
        db.session.commit()

删除后数据库

N:M的模型 *** 作

多对多的关系一般采用建立第三张表的方式,并在任一张主表中建立索引关系

创建模型
from models import db

# 用户-角色多对多表
user_role = db.Table('user_role',
                     db.Column('user_id',db.Integer,db.ForeignKey('user_model.id')),
                     db.Column('role_id',db.Integer,db.ForeignKey('role.id')))
class UserModel(db.Model):
    #主键
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    #普通字段
    name=db.Column(db.String(30),nullable=False,comment='姓名')
    auth_key = db.Column(db.String(100),nullable=False,comment='密码')
    phone=db.Column(db.String(11),unique=True,comment='电话')

    #多对多索引关系
    roles=db.relationship('Role',secondary=user_role,backref='users')




# 角色模型
class Role(db.Model):
    #主键
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    #普通字段
    name=db.Column(db.String(30),nullable=False,comment='角色名称')
模型间关系

用户和角色表之间存在多对多关系,建立第三张表user_role来存储这些关系,并在用户表建立索引

模型 *** 作 添加数据

为主键为1的用户添加了一个超级管理员角色

    def test_addmodel2(self):
        app.app_context().push()
        user=UserModel.query.get(1)
        role=Role()
        role.name='超级管理员'
        db.session.add(role)
        user.roles.append(role)
        db.session.commit()


测试显示的数据库语句

数据库数据表

查询与反向查询
    def test_query(self):
        app.app_context().push()
        user=UserModel.query.get(1)
        print(user.roles)

        role=Role.query.all()[0]
        print(role.users)
roles=db.relationship('Role',secondary=user_role,backref='users')

用户表中的索引关系语句是关键,定义了反向查询的名称

修改数据

修改用户的第一个角色 的名称为普通管理员

    def test_update2(self):
        app.app_context().push()

        user=UserModel.query.get(1)
        user.roles[0].name='普通管理员'
        db.session.commit()

测试显示的数据库 *** 作

数据库结果

删除数据

先给这些用户添加实习工角色

    def test_del2(self):
        app.app_context().push()
        role=Role()
        role.name='实习工'
        db.session.add(role)
        users=UserModel.query.filter(UserModel.name.like('dsd%'))
        for user in users:
            user.roles.append(role)
        db.session.commit()

此时第三张表数据是这样的

再将所有实习工身份的用户删除

    def test_del3(self):
        app.app_context().push()

        roles=Role.query.filter(Role.name=='实习工').all()
        for role in roles:
            users=role.users
            for user in users:
                db.session.delete(user)

        db.session.commit()

用户表已经没有了这些人

第三张表的关系也同步删除了

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4677653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存