Files
2026-06-02 17:46:38 +08:00

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