From 1fe5dd0031747bb704da337ceac0a79bb47b57f0 Mon Sep 17 00:00:00 2001 From: Yerassyl Zhanymkanov Date: Sat, 2 Sep 2023 00:22:57 +0600 Subject: [PATCH] Upgrade No. 8 to Pydantic v2 --- README.md | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 4fcd460..b248131 100644 --- a/README.md +++ b/README.md @@ -416,16 +416,11 @@ Having a controllable global base model allows us to customize all the models wi For example, we could have a standard datetime format or add a super method for all subclasses of the base model. ```python from datetime import datetime +from typing import Any from zoneinfo import ZoneInfo -import orjson from fastapi.encoders import jsonable_encoder -from pydantic import BaseModel, root_validator - - -def orjson_dumps(v, *, default): - # orjson.dumps returns bytes, to match standard json.dumps we need to decode - return orjson.dumps(v, default=default).decode() +from pydantic import BaseModel, ConfigDict, model_validator def convert_datetime_to_gmt(dt: datetime) -> str: @@ -435,15 +430,15 @@ def convert_datetime_to_gmt(dt: datetime) -> str: return dt.strftime("%Y-%m-%dT%H:%M:%S%z") -class ORJSONModel(BaseModel): - class Config: - json_loads = orjson.loads - json_dumps = orjson_dumps - json_encoders = {datetime: convert_datetime_to_gmt} # method for customer JSON encoding of datetime fields +class CustomModel(BaseModel): + model_config = ConfigDict( + json_encoders={datetime: convert_datetime_to_gmt}, + populate_by_name=True, + ) - @root_validator() - def set_null_microseconds(cls, data: dict) -> dict: - """Drops microseconds in all the datetime field values.""" + @model_validator(mode="before") + @classmethod + def set_null_microseconds(cls, data: dict[str, Any]) -> dict[str, Any]: datetime_fields = { k: v.replace(microsecond=0) for k, v in data.items() @@ -453,10 +448,11 @@ class ORJSONModel(BaseModel): return {**data, **datetime_fields} def serializable_dict(self, **kwargs): - """Return a dict which contains only serializable fields.""" - default_dict = super().dict(**kwargs) + """Return a dict which contains only serializable fields.""" + default_dict = self.model_dump() return jsonable_encoder(default_dict) + ``` In the example above we have decided to make a global base model which: - uses [orjson](https://github.com/ijl/orjson) to serialize data