1.概述
由于当我们添加商品时,一个商品可能会存在多个图片,多个参数。遇到这样的情况,我们之前的数据表模型,只是建立了一个固定字段,只能存在一个图片,一个参数,这样就很不友好。这里,我们应该新建两张表,去做到多对多之间的关系。
2.建立多对多关系模型代码展示
# 商品分类
class Category(db.Model):
__tablename__ = 't_category'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), nullable=False)
level = db.Column(db.Integer)
# 外键的添加
pid = db.Column(db.Integer, db.ForeignKey('t_category.id'))
# 自关联的创建
children = db.relationship('Category')
attrs = db.relationship('Attribute', backref='category')
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'level': self.level,
'pid': self.pid
}
# 商品的参数
class Attribute(db.Model):
__tablename__ = 't_attribute'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
val = db.Column(db.String(255))
cid = db.Column(db.Integer, db.ForeignKey('t_category.id')) # 外键关联商品分类表
_type = db.Column(db.Enum('static', 'dynamic')) # 枚举规定值
# 返回值
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'val': self.val,
'cid': self.cid,
'type': self._type
}
# 商品
class Goods(db.Model):
__tablename__ = 't_goods'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(512)) # 商品名称
price = db.Column(db.Float)
number = db.Column(db.Integer) # 商品库存
introduce = db.Column(db.Text) # 商品介绍
big_log = db.Column(db.String(256)) # 商品大照片
small_log = db.Column(db.String(256)) # 商品小照片
state = db.Column(db.Integer) # 0未通过 1审核中 2已审核
is_promote = db.Column(db.Integer) # 是否促销
hot_number = db.Column(db.Integer) # 促销数量
weight = db.Column(db.Integer) # 权重比例:用于促销
cid_one = db.Column(db.Integer, db.ForeignKey('t_category.id'))
cid_two = db.Column(db.Integer, db.ForeignKey('t_category.id'))
cid_three = db.Column(db.Integer, db.ForeignKey('t_category.id')) # 属于哪个商品分类,有三级菜单
# 外键的方式与Category表建立关系
category = db.relationship('Category', foreign_keys=[cid_three])
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'price': self.price,
'number': self.number,
'introduce': self.introduce,
'big_log': self.big_log,
'small_log': self.small_log,
'state': self.state,
'is_promote': self.is_promote,
'hot_number': self.hot_number,
'weight': self.weight,
'cid_one': self.cid_one,
'cid_two': self.cid_two,
'cid_three': self.cid_three,
'attrs': [a.to_dict() for a in self.category.attrs]
}
# 由于一个商品有多张图片需要存放,需要单独去创建一个数据表去保存
class Picture(db.Model):
__tablename__ = 't_picture'
id = db.Column(db.Integer, primary_key=True)
path = db.Column(db.String(512))
gid = db.Column(db.Integer, db.ForeignKey('t_goods.id'))
# 由于一个商品有多个属性需要存放,需要单独去创建一个数据表去保存
# 和商品、商品的参数表进行关联
class GoodsAttr(db.Model):
__tablename__ = 't_goods_attr'
gid = db.Column(db.Integer, db.ForeignKey('t_goods.id'), primary_key=True)
aid = db.Column(db.Integer, db.ForeignKey('t_attribute.id'), primary_key=True)
val = db.Column(db.String(512))
_type = db.Column(db.String(8))
在使用migrate进行数据迁移,upgrade进行保存数据,如果需要具体展示,可以查看此专栏之前的建立模型的文章