十三、模型与模型关系
当用户在书籍详情页面,点击“赠送此书”时,此书要保存在数据库,以便以后能查询到谁要赠送此书。
13.1 设计模型
因此,应该如何设计模型?
有哪些模型:
- 用户模型:谁赠送此书
- 图书模型S:赠送哪本书
模型与模型之间的关系:
赠书这一行为,是两个模型之间的相互作用,所以用第三个的模型gift来表示
从数据库的角度看,一个用户可以赠送多本书,同时一本书也可以被多个用户来赠送,即多对多的关系,所以需要第三张表来表示。
代码实现:
用代码新建模型:
为两个新模型新建两个模块,同时,新建初始化的模块base.py
:
在app|models|base.py
中:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
在app|models|user.py
中:
from sqlalchemy import Column, Integer, String, Boolean, Float
from app.models.base import db
class User(db.Model): # 下面是其一些属性,类变量
id = Column(Integer, primary_key=True) # 用户的唯一标识
nickname = Column(String(24), nullable=False) # 用户的昵称
phone_number = Column(String(18), unique=True)
email = Column(String(50), unique=True, nullable=False)
confirmed = Column(Boolean, default=False) # 下面四个:随以后业务发展,后续介绍
beans = Column(Float, default=0)
send_counter = Column(Integer, default=0)
receive_counter = Column(Integer, default=0)
wx_open_id = Column(String(50)) # 下面两个:本项目没用,是给以后鱼书开发小程序准备的
wx_name = Column(String(32))
在app|models|gift.py
中:
from sqlalchemy import Column, Integer, Boolean
from app.models.base import db
class Gift(db.Model):
id = Column(Integer, primary_key=True) # 礼物的唯一标识
launched = Column(Boolean, default=False) # 礼物有没有送出去?默认False,礼物没有赠送出去
模型创建完毕。
13.2 设计模型之间的关系
在gift.py
模型中增加一些属性,以表明user.py
模型和book.py
模型之间的关系.
from sqlalchemy import Column, Integer, Boolean, ForeignKey, String
from sqlalchemy.orm import relationship
from app.models.base import db
class Gift(db.Model): # 增加三个属性
id = Column(Integer, primary_key=True)
launched = Column(Boolean, default=False)
user = relationship('user') # 在gift模型中,引用user这个模型,用relationship表示引用关系
uid = Column(Integer, ForeignKey('user.id')) # 具体是引用哪一个用户呢? # 外键ForeignKey:数据库术语
isbn = Column(String(15), nullable=False) # 同一本书可以被赠送多次 # 在gift模型中,引用book这个模型
十四、自定义基类模型
14.1 假删除、软删除
上述一个一个的模型,都会成为数据库中一条条的记录。但是,假如要删除某一条记录,是直接在数据库中删除吗?
不是。
直接在数据库中删除是属于物理删除,有一些缺点:
- 有可能误删,找不回来
- 互联网需要分析用户的历史行为,例如不想赠送了想撤回,就撤不回来了。
因此,应该通过更改变量的状态,来控制这条数据是否被删除 。这种方式就称为假删除、软删除,
14.2 自定义基类模型
在app|models|base.py
中:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import SmallInteger, Column, Integer
db = SQLAlchemy()
class Base(db.Model): # 为所有模型定义一个基类模型,将status属性放进去,这样每一个继承基模的子模型就都可以拥有这个属性了
status = Column(SmallInteger, default=1) # 通过更改变量的状态,来控制这条数据是否被删除 # 1 表示此条数据存在
# create_time = Column('create_time', Integer)
在app|models|gift.py
中:
from sqlalchemy import Column, Integer, Boolean, ForeignKey, String
from sqlalchemy.orm import relationship
from app.models.base import Base
class Gift(Base): # 继承基类模型,以获得控制某条数据是否被删除的属性
id = Column(Integer, primary_key=True) # 礼物的唯一标识
launched = Column(Boolean, default=False) # 礼物有没有送出去?默认False,礼物没有赠送出去
user = relationship('user') # 在gift模型中,引用user这个模型,用relationship表示引用关系
uid = Column(Integer, ForeignKey('user.id')) # 具体是引用哪一个用户呢? # 外键ForeignKey:数据库术语
isbn = Column(String(15), nullable=False) # 同一本书可以被赠送多次 # 在gift模型中,引用book这个模型
Comments | NOTHING