95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
import datetime
|
|
|
|
from paste.db.basemodel import BaseModel
|
|
|
|
|
|
class CommonModel(BaseModel):
|
|
"""
|
|
公共模型类。重写某些 BaseModel 类中的方法。
|
|
"""
|
|
|
|
__abstract__ = True
|
|
|
|
@classmethod
|
|
def trans_format(cls, dic: dict, skip_keys: list[str] = None,
|
|
trans_datetime: bool = False, long_to_str: bool = False):
|
|
"""
|
|
对特殊日期及长整数进行格式转换::
|
|
|
|
1、仅处理字典类型数据。
|
|
2、日期、时间日期格式数据,若年份小于 1000 则视为无效日期,转为空字符串。
|
|
3、长度大于 16 位的整数转为字符串。
|
|
|
|
:param dic: 需要转换的字典
|
|
:param skip_keys: 跳过的,不需要转换的键。跳过的字段会一直延续到内部对象
|
|
:param trans_datetime: 是否转换日期时间字段中的特殊日期。
|
|
:param long_to_str: 当 bigint 长度大于 16 位时转为 str
|
|
:return: 转换后的字典
|
|
"""
|
|
_inner_dic = dic.copy()
|
|
|
|
# 遍历处理
|
|
for _key, _val in dic.items():
|
|
# 删除跳过的键值
|
|
if skip_keys and _key in skip_keys:
|
|
_inner_dic.pop(_key, None)
|
|
continue
|
|
|
|
if not _val:
|
|
# 空项跳过
|
|
continue
|
|
|
|
# 转换日期时间
|
|
if trans_datetime and isinstance(_val, (datetime.date, datetime.datetime)):
|
|
_year = _val.year
|
|
if _year <= 1000:
|
|
_inner_dic[_key] = ''
|
|
|
|
# bigint 转 str
|
|
if long_to_str and isinstance(_val, int) and len(str(_val)) > 16:
|
|
_inner_dic[_key] = str(_val)
|
|
|
|
# 处理列表
|
|
if isinstance(_val, list):
|
|
_tmp_list = []
|
|
for _v in _val:
|
|
if isinstance(_v, dict):
|
|
# 递归处理字典
|
|
_tmp_list.append(cls.trans_format(
|
|
_v, skip_keys=skip_keys, trans_datetime=trans_datetime, long_to_str=long_to_str
|
|
))
|
|
else:
|
|
_tmp_list.append(_v)
|
|
_inner_dic[_key] = _tmp_list
|
|
|
|
# 递归处理字典
|
|
if isinstance(_val, dict):
|
|
_inner_dic[_key] = cls.trans_format(
|
|
_val, skip_keys=skip_keys, trans_datetime=trans_datetime, long_to_str=long_to_str
|
|
)
|
|
|
|
return _inner_dic
|
|
|
|
def to_dict(self, skip_fields: list[str] = None, trans_datetime: bool = False, long_to_str: bool = False):
|
|
"""
|
|
数据模型转字典。
|
|
|
|
:param skip_fields: 跳过的,不需要转换的字段。跳过的字段会一直延续到内部对象
|
|
:param trans_datetime: 是否转换日期时间字段中的特殊日期。
|
|
:param long_to_str: 当 bigint 长度大于 16 位时转为 str
|
|
:return: 转换后的字典数据
|
|
"""
|
|
model_dict = super().to_dict()
|
|
|
|
# 没有需要处理的行为,直接返回
|
|
_has_action = skip_fields or trans_datetime or long_to_str
|
|
if not _has_action:
|
|
return model_dict
|
|
|
|
# 对特殊日期和长整数进行格式转换,跳过的字段会一直延续到内部对象
|
|
model_dict = self.trans_format(
|
|
model_dict, skip_keys=skip_fields, trans_datetime=trans_datetime, long_to_str=long_to_str
|
|
)
|
|
|
|
return model_dict
|