第八章 创建数据库模型及模型间关系(3/3)


目录


十三、模型与模型关系

当用户在书籍详情页面,点击“赠送此书”时,此书要保存在数据库,以便以后能查询到谁要赠送此书。

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这个模型

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 第八章 创建数据库模型及模型间关系(3/3)


Follow excellence, and success will chase you.