8.3 模型关系

分析业务逻辑,用户赠送书籍,需要将用户赠送书籍的数据保存到数据库中。为此我们需要建立业务模型,并通过codeFirst的原则,反向生成数据库表

1.模型与模型关系

  • 首先我们需要一个用户User模型,来存储用户信息

  • 其次我们需要一个Book模型,来存储书籍的信息

  • 我们还需要一个Gift模型,来存储哪个用户想要赠送哪本书。从数据库的角度来看,用户和书籍是多对多的关系,多对多的关系需要第三章表。

    image.png

2.编写建立模型代码

models/user.py

from sqlalchemy import Column
from sqlalchemy import Integer, Float
from sqlalchemy import String, Boolean

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))

models/gift.py

from app.models.base import db
from sqlalchemy import Column, String, Integer, ForeignKey, Boolean
from sqlalchemy.orm import relationships



class Gift(db.Model):
    id = Column(Integer, primary_key=True, autoincrement=True)
    # relationships表示管理关系
    user = relationships('User')
    # ForeignKey定义外键约束
    uid = Column(Integer, ForeignKey('user.id'))
    # 书籍我们记录isbn编号,因为书籍信息是从网络获取的
    isbn = Column(String(15),nullable=True)
    # 是否已经赠送出去
    launched = Column(Boolean, default=False)

3.自定义基类模型

  • 每个表的信息,在删除的时候都不应该物理的从数据库里删除,而应该设置一个标志位,默认为0,如果删除了则置为1,这样可以搜索到历史的用户记录。

  • 像标志位这样的参数,每个表里都有同样的属性,我们应该建立一个基类,来存储这些共有属性

base.py

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import SmallInteger, Column

__author__ = "gaowenfeng"

db = SQLAlchemy()


class Base(db.Model):
    __abstract__ = True
    create_time = Column(Integer)
    status = Column(SmallInteger, default=1)

    def __init__(self):
        self.create_time = int(datetime.now().timestamp())

Last updated

Was this helpful?