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