1
+ import json
1
2
from typing import Union
2
3
3
4
import pydantic
5
+ import pytest
4
6
5
7
from pydantic_partial import PartialModelMixin , create_partial_model
6
8
from pydantic_partial ._compat import PYDANTIC_V1 , PYDANTIC_V2
@@ -12,7 +14,11 @@ def _field_is_required(model: Union[type[pydantic.BaseModel], pydantic.BaseModel
12
14
elif PYDANTIC_V2 :
13
15
def _field_is_required (model : Union [type [pydantic .BaseModel ], pydantic .BaseModel ], field_name : str ) -> bool :
14
16
"""Check if a field is required on a pydantic V2 model."""
15
- return model .model_fields [field_name ].is_required ()
17
+ json_required = (
18
+ model .model_fields [field_name ].json_schema_extra is not None
19
+ and model .model_fields [field_name ].json_schema_extra .get ("required" , False )
20
+ )
21
+ return model .model_fields [field_name ].is_required () or json_required
16
22
else :
17
23
raise DeprecationWarning ("Pydantic has to be in version 1 or 2." )
18
24
@@ -21,6 +27,10 @@ class Something(pydantic.BaseModel):
21
27
name : str
22
28
age : int
23
29
already_optional : None = None
30
+ if PYDANTIC_V1 :
31
+ already_required : int = pydantic .Field (default = 1 , required = True )
32
+ if PYDANTIC_V2 :
33
+ already_required : int = pydantic .Field (default = 1 , json_schema_extra = {"required" : True })
24
34
25
35
26
36
class SomethingWithMixin (PartialModelMixin , pydantic .BaseModel ):
@@ -62,6 +72,21 @@ def test_partial_model_will_be_the_same_on_mixin():
62
72
63
73
assert SomethingWithMixinPartial1 is SomethingWithMixinPartial2
64
74
75
+ @pytest .mark .skipif (PYDANTIC_V2 , reason = "Pydantic V2 does not support json_schema_extra" )
76
+ def test_pydantic_v1partial_model_will_override_json_required ():
77
+ SomethingPartial = create_partial_model (Something )
78
+ assert _field_is_required (SomethingPartial , "already_required" ) is False
79
+ schema = json .loads (SomethingPartial .schema_json ())
80
+ assert schema ["properties" ]["already_required" ]["nullable" ] is True
81
+ assert schema ["properties" ]["already_required" ]["required" ] is False
82
+
83
+ @pytest .mark .skipif (PYDANTIC_V1 , reason = "Pydantic V1 does not support json_schema_extra" )
84
+ def test_pydantic_v2_partial_model_will_override_json_required ():
85
+ SomethingPartial = create_partial_model (Something )
86
+ assert _field_is_required (SomethingPartial , "already_required" ) is False
87
+ schema = SomethingPartial .model_json_schema ()
88
+ assert schema ["properties" ]["already_required" ]["nullable" ] is True
89
+ assert schema ["properties" ]["already_required" ]["required" ] is False
65
90
66
91
def test_partial_class_name_can_be_overridden ():
67
92
SomethingPartial = create_partial_model (Something , "name" )
0 commit comments