77 "make_field_required" ,
88]
99
10+ import inspect
1011from copy import copy
1112from functools import singledispatch
1213from typing import Annotated , Any , TypeVar , cast
1314
1415from fastapi_pagination .typing_utils import remove_optional_from_tp
1516
17+ from .consts import IS_PYDANTIC_V2
1618from .types import AnyBaseModel , AnyField
17- from .v1 import FieldV1
1819from .v2 import FieldV2 , is_pydantic_v2_model
1920
2021TAny = TypeVar ("TAny" )
@@ -37,16 +38,25 @@ def get_model_fields(model: type[AnyBaseModel], /) -> dict[str, AnyField]:
3738
3839
3940def is_pydantic_field (field : Any , / ) -> bool :
40- return isinstance (field , ( FieldV1 , FieldV2 ) )
41+ return is_pydantic_v2_field (field ) or is_pydantic_v1_field ( field )
4142
4243
43- @singledispatch
44- def make_field_optional (field : Any ) -> Any : # pragma: no cover
45- raise ValueError (f"Invalid field type { field !r} " )
44+ def is_pydantic_v2_field (field : Any , / ) -> bool :
45+ return isinstance (field , FieldV2 )
4646
4747
48- @make_field_optional .register
49- def _ (field : FieldV1 , / ) -> Any :
48+ def is_pydantic_v1_field (field : Any , / ) -> bool :
49+ cls = type (field )
50+
51+ names = {"pydantic.v1.fields.ModelField" }
52+ if not IS_PYDANTIC_V2 :
53+ names .add ("pydantic.fields.ModelField" )
54+
55+ return any (f"{ mro_cls .__module__ } .{ mro_cls .__qualname__ } " in names for mro_cls in inspect .getmro (cls ))
56+
57+
58+ @singledispatch
59+ def make_field_optional (field : Any ) -> Any : # pragma: no cover
5060 return None
5161
5262
@@ -63,11 +73,6 @@ def _(field: FieldV2, /) -> Any:
6373
6474@singledispatch
6575def make_field_required (field : Any , / ) -> Any : # pragma: no cover
66- raise ValueError (f"Invalid field type { field !r} " )
67-
68-
69- @make_field_required .register
70- def _ (field : FieldV1 , / ) -> Any :
7176 field = copy (field )
7277 field .required = True
7378 field .default = ...
@@ -89,11 +94,6 @@ def _(field: FieldV2, /) -> Any:
8994
9095@singledispatch
9196def get_field_tp (field : Any , / ) -> Any : # pragma: no cover
92- raise ValueError (f"Invalid field type { field !r} " )
93-
94-
95- @get_field_tp .register
96- def _ (field : FieldV1 , / ) -> Any :
9797 return field .type_
9898
9999
0 commit comments