Skip to content

Commit 4b84a38

Browse files
authored
Merge pull request #70 from surenkov/69-the-allow_null-parameter-is-not-passed-in-rest-framework-schemafield
Propagate `allow_null` parameter to base DRF Field
2 parents 5811ef7 + fc5326d commit 4b84a38

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

django_pydantic_field/v2/rest_framework/fields.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@ def __init__(
2323
self,
2424
schema: type[types.ST],
2525
config: pydantic.ConfigDict | None = None,
26-
*args,
27-
allow_null: bool = False,
2826
**kwargs,
2927
):
3028
deprecation.truncate_deprecated_v1_export_kwargs(kwargs)
29+
allow_null = kwargs.get("allow_null", False)
3130

3231
self.schema = schema
3332
self.config = config
3433
self.export_kwargs = types.SchemaAdapter.extract_export_kwargs(kwargs)
3534
self.adapter = types.SchemaAdapter(schema, config, None, None, allow_null, **self.export_kwargs)
36-
super().__init__(*args, **kwargs)
35+
super().__init__(**kwargs)
3736

3837
def bind(self, field_name: str, parent: BaseSerializer):
3938
if not self.adapter.is_bound:

django_pydantic_field/v2/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def get_origin_type(cls: type):
5151
if sys.version_info >= (3, 9):
5252

5353
def evaluate_forward_ref(ref: ty.ForwardRef, ns: Mapping[str, ty.Any]) -> ty.Any:
54-
return ref._evaluate(dict(ns), {}, frozenset())
54+
return ref._evaluate(dict(ns), {}, recursive_guard=frozenset())
5555

5656
else:
5757

tests/v2/rest_framework/test_fields.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,27 @@ def test_model_serializer_marshalling_with_schema_field():
9090
assert serializer.data == expected_data
9191

9292

93+
def test_serializer_field_allow_null_passes():
94+
class SampleSerializer(serializers.Serializer):
95+
foo = rest_framework.SchemaField(InnerSchema, allow_null=True)
96+
97+
serializer = SampleSerializer(data={"foo": None})
98+
try:
99+
serializer.is_valid(raise_exception=True)
100+
except exceptions.ValidationError:
101+
pytest.fail("Null value should be accepted.")
102+
103+
104+
def test_serializer_field_disallow_null_fails():
105+
class SampleSerializer(serializers.Serializer):
106+
foo = rest_framework.SchemaField(InnerSchema, allow_null=False)
107+
108+
serializer = SampleSerializer(data={"foo": None})
109+
110+
with pytest.raises(exceptions.ValidationError, match=".*This field may not be null.*"):
111+
serializer.is_valid(raise_exception=True)
112+
113+
93114
@pytest.mark.parametrize(
94115
"export_kwargs",
95116
[

0 commit comments

Comments
 (0)