欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

flask8:数据库对象序列化

程序员文章站 2022-06-02 13:16:28
...

1.在数据对象基类上增加__getitem__ 与 keys 方法,使对象可以通过字典形式序列化

class Base(db.Model):
    __abstract__ = True
    create_date = Column('create_date', DateTime)
    invalid_date =  Column('invalid_date', DateTime)
    stat = Column(String(10), default='normal')

    def __init__(self):
        self.create_date = datetime.now()
        self.stat = 'normal'

    def set_attrs(self, attrs_dict):
        for key, value in attrs_dict.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)

    def delete(self):
        self.stat = 'invalid'
        self.invalid_date = datetime.now()

    # 返回对象对应属性的值
    def __getitem__(self, item):
        return getattr(self, item)

    # 定义返回字典中的键
    def keys(self):
        return self.fields

    def hide(self, *keys):
        for key in keys:
            self.fields.remove(key)
        return self

    def append(self, *keys):
        for key in keys:
            self.fields.append(key)
        return self

2.重写JSONEncoder函数,对不能序列化的对象指定***方式

class JSONEncoder(_JSONEncoder):
    def default(self, o):
        if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
            return dict(o)
        if isinstance(o, date):
            return o.strftime('%Y-%m-%d')
        if isinstance(o, datetime):
            return o.strftime("%Y-%m-%d %H-%M-%S")
        raise ServerError()

3.重写Flask类,挂载新的JSONEncoder函数

class Flask(_Flask):
    json_encoder = JSONEncoder