From 74aa5581d3d297c4b741ac4ac038dc0e994498bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B5=E9=92=8A=E6=98=8E?= <40025941+0x587@users.noreply.github.com> Date: Thu, 17 Aug 2023 23:53:52 +0800 Subject: [PATCH 1/3] Fix bugs that are not compatible with pydantic2.x --- fastapi_crudrouter/core/_utils.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/fastapi_crudrouter/core/_utils.py b/fastapi_crudrouter/core/_utils.py index ef3562e4..4bdfa864 100644 --- a/fastapi_crudrouter/core/_utils.py +++ b/fastapi_crudrouter/core/_utils.py @@ -26,11 +26,23 @@ def schema_factory( Is used to create a CreateSchema which does not contain pk """ - fields = { - f.name: (f.type_, ...) - for f in schema_cls.__fields__.values() - if f.name != pk_field_name - } + # for handle pydantic 2.x migration + from pydantic import __version__ as pydantic_version + + if int(pydantic_version.split(".")[0]) >= 2: + # pydantic 2.x + fields = { + fk: (fv.annotation, ...) + for fk, fv in schema_cls.model_fields.items() + if fk != pk_field_name + } + else: + # pydantic 1.x + fields = { + f.name: (f.type_, ...) + for f in schema_cls.__fields__.values() + if f.name != pk_field_name + } name = schema_cls.__name__ + name schema: Type[T] = create_model(__model_name=name, **fields) # type: ignore From 6fbf927d2b9c3ab72486da3d10c94d45e7359c2f Mon Sep 17 00:00:00 2001 From: ChiuMing SIU <40025941+0x587@users.noreply.github.com> Date: Wed, 13 Sep 2023 18:23:21 +0800 Subject: [PATCH 2/3] Update _utils.py --- fastapi_crudrouter/core/_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fastapi_crudrouter/core/_utils.py b/fastapi_crudrouter/core/_utils.py index 4bdfa864..0c997eae 100644 --- a/fastapi_crudrouter/core/_utils.py +++ b/fastapi_crudrouter/core/_utils.py @@ -14,7 +14,10 @@ def __init__(self, *args, **kwargs) -> None: # type: ignore def get_pk_type(schema: Type[PYDANTIC_SCHEMA], pk_field: str) -> Any: try: - return schema.__fields__[pk_field].type_ + if int(pydantic_version.split(".")[0]) >= 2: + return schema.model_fields[pk_field].annotation + else: + return schema.__fields__[pk_field].type_ except KeyError: return int From 058a317b216dd9a9bc62cb764dce91289bd7043a Mon Sep 17 00:00:00 2001 From: anthonypelletier Date: Fri, 6 Oct 2023 03:43:32 +0200 Subject: [PATCH 3/3] Refactoring --- fastapi_crudrouter/core/_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fastapi_crudrouter/core/_utils.py b/fastapi_crudrouter/core/_utils.py index 0c997eae..dd0ea025 100644 --- a/fastapi_crudrouter/core/_utils.py +++ b/fastapi_crudrouter/core/_utils.py @@ -1,7 +1,7 @@ from typing import Optional, Type, Any from fastapi import Depends, HTTPException -from pydantic import create_model +from pydantic import create_model, __version__ as pydantic_version from ._types import T, PAGINATION, PYDANTIC_SCHEMA @@ -14,6 +14,7 @@ def __init__(self, *args, **kwargs) -> None: # type: ignore def get_pk_type(schema: Type[PYDANTIC_SCHEMA], pk_field: str) -> Any: try: + # for handle pydantic 2.x migration if int(pydantic_version.split(".")[0]) >= 2: return schema.model_fields[pk_field].annotation else: @@ -30,8 +31,6 @@ def schema_factory( """ # for handle pydantic 2.x migration - from pydantic import __version__ as pydantic_version - if int(pydantic_version.split(".")[0]) >= 2: # pydantic 2.x fields = { @@ -90,3 +89,4 @@ def pagination(skip: int = 0, limit: Optional[int] = max_limit) -> PAGINATION: return {"skip": skip, "limit": limit} return Depends(pagination) +