需求描述
在使用SQLAlchemy进行类定义的时候通常是直接继承自Model
, 例如下面代码:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class RoleModel(db.Model):
__tablename__ = 'sys_role'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
rolename = db.Column(db.Text)
permission = db.Column(db.Text)
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class UserModel(db.Model):
__tablename__ = 'sys_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.Text)
password = db.Column(db.Text)
role = db.Column(db.Integer)
enable = db.Column(db.Boolean)
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
RoleModel
和UserModel
有相同的id
列定义和to_dict()
方法, 现在想要在Model
类的基础上继承一个包含了公用id
列和to_dict()
方法的BaseModel
类, 再让其他类继承自这个BaseModel
从而减少重复编码的工作.
实现方法
在定义BaseModel
的时候只需要加上__abstract__ = True
这一句就可以让其他类继承它了, 修改后的代码, 清爽许多!
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# 自定义的基础类, 包含公用id列定义和to_dict()方法
class BaseModel(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class RoleModel(BaseModel):
__tablename__ = 'sys_role'
rolename = db.Column(db.Text)
permission = db.Column(db.Text)
class UserModel(BaseModel):
__tablename__ = 'sys_user'
username = db.Column(db.Text)
password = db.Column(db.Text)
role = db.Column(db.Integer)
enable = db.Column(db.Boolean)