From 9912567004796882fced9a002b5134eaf13c4cea Mon Sep 17 00:00:00 2001 From: kf_wuhao <15392746632@qq.com> Date: Wed, 23 Dec 2020 13:32:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9F=BA=E7=A1=80=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/model.py | 87 +++++++++++---------------------------------- utils/__init__.py | 1 + utils/field_type.py | 4 +++ 3 files changed, 26 insertions(+), 66 deletions(-) create mode 100644 utils/field_type.py diff --git a/db/model.py b/db/model.py index d6c0f07..733a4f1 100644 --- a/db/model.py +++ b/db/model.py @@ -1,5 +1,3 @@ -from typing import Union, Any - from pydantic import BaseModel, Field from bson.objectid import ObjectId @@ -11,79 +9,36 @@ class MdbObjectId(ObjectId): @classmethod def validate(cls, v): - if not isinstance(v, ObjectId): - raise TypeError('ObjectId required') - return v + try: + res = ObjectId(v) + except: + raise TypeError('不能装换为 ObjectId') + else: + return res class GBaseModel(BaseModel): - """ - 字段名与保护变量命名冲突,将 _ 前缀变为后缀,读出再还原 - """ - id_: MdbObjectId = Field(..., title="平台") - platform_: str = Field(None, title="平台") - channel_name_: str = Field(None, title="channel") - owner_name_: str = Field(None, title="owner") - channel_uid_: str = Field(None, title="channel_uid") - device_id_: str = Field(None, title='device_id') - district_server_id_: int = Field(None, title="区服id") - game_role_id_: str = Field(None, title="角色id") - event_time_: int = Field(..., title="事件时间") + id: MdbObjectId = Field(..., title="平台", alias='_id') + platform: str = Field(None, title="平台", alias='_platform') + channel_name: str = Field(None, title="channel", alias='_channel_name') + owner_name: str = Field(None, title="owner", alias='_owner_name') + channel_uid: str = Field(None, title="channel_uid", alias='_channel_uid') + device_id: str = Field(None, title='device_id', alias='_device_id') + district_server_id: int = Field(None, title="区服id", alias='_district_server_id') + game_role_id: str = Field(None, title="角色id", alias='_game_role_id') + event_time: int = Field(..., title="事件时间", alias='_event_time') role_create_time: int = Field(None, title="角色创建时间") role_level: int = Field(None, title="角色等级") role_vip: int = Field(None, title="角色vip等级") - - def __init__(self, **data: Any): - if isinstance(data.get('_id'), str) and len(data['_id']) == 24: - data['_id'] = ObjectId(data['_id']) - - new_data = {} - for k, v in data.items(): # type:str,Any - if k.startswith('_'): - new_k = k[1:] + k[0] - new_data[new_k] = v - else: - new_data[k] = v - - super().__init__(**new_data) - - def dict( - self, - *, - include: Union['AbstractSetIntStr', 'MappingIntStrAny'] = None, - exclude: Union['AbstractSetIntStr', 'MappingIntStrAny'] = None, - by_alias: bool = False, - skip_defaults: bool = None, - exclude_unset: bool = False, - exclude_defaults: bool = False, - exclude_none: bool = False, - ) -> 'DictStrAny': - data = super().dict() - - new_data = {} - for k, v in data.items(): # type:str,Any - if k.endswith('_'): - new_k = k[-1] + k[:-1] - new_data[new_k] = v - else: - new_data[k] = v - return new_data - - class Config: - arbitrary_types_allowed = True + role_stage: int = Field(None, title="关卡") @classmethod def get_fields(cls): - fields = [] - for k in cls.__fields__: - if k.endswith('_'): - fields.append(k[-1] + k[:-1]) - else: - fields.append(k) - return fields + return [v.alias for v in cls.__fields__.values()] + if __name__ == '__main__': - obj = GBaseModel(_id="5fd0f4812de17aeba6c1a374", role_level='2', aaa=123, _platform=13566) - print(obj.dict()) - print(obj.role_level) + obj = GBaseModel(_id="5fd0f4812de17aeba6c1a373", role_level='2', aaa=123, _platform=13566, _event_time=123456789) + print(GBaseModel.get_fields()) + print(obj.dict(by_alias=True)) diff --git a/utils/__init__.py b/utils/__init__.py index 80011e8..34150bf 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,4 +1,5 @@ from loguru import logger +from .field_type import * logger.add('/data/log/data_cleaning/log.log', format="{time} {level} {name}:{line} {message}", level="INFO", rotation="100 MB", retention='7 days', diff --git a/utils/field_type.py b/utils/field_type.py new file mode 100644 index 0000000..0dc3e1e --- /dev/null +++ b/utils/field_type.py @@ -0,0 +1,4 @@ +from typing import TypeVar + +IntStr = TypeVar('IntStr', int, str) +IntFloat = TypeVar('IntFloat', int, float)