Skip to content

Commit cacfba2

Browse files
committed
Allow raw dict to be passed as field config
1 parent c4aaef8 commit cacfba2

File tree

5 files changed

+25
-6
lines changed

5 files changed

+25
-6
lines changed

django_pydantic_field/base.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.core.serializers.json import DjangoJSONEncoder
55

66
import pydantic
7+
from pydantic.config import get_config, inherit_config
78
from pydantic.main import create_model
89
from pydantic.typing import display_as_type
910

@@ -87,13 +88,16 @@ def _get_field_schema_name(self, schema: t.Type[t.Any]) -> str:
8788

8889
def _get_field_schema_params(self, schema: t.Type["ST"], config: t.Optional["ConfigType"] = None, **kwargs) -> dict:
8990
params: t.Dict[str, t.Any] = dict(kwargs, __root__=(t.Optional[schema], ...))
90-
91-
if config is None:
92-
config = getattr(schema, "Config", None)
91+
parent_config = getattr(schema, "Config", None)
9392

9493
if config is not None:
95-
params.update(__config__=config)
94+
config = get_config(config)
95+
if parent_config is not None:
96+
config = inherit_config(config, parent_config)
97+
else:
98+
config = parent_config
9699

100+
params.update(__config__=config)
97101
return params
98102

99103
def _extract_export_kwargs(self, ctx: dict, extractor=dict.get):

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = django-pydantic-field
3-
version = 0.1.4
3+
version = 0.1.5
44
url = https://github.com/surenkov/django-pydantic-field
55

66
description = Django JSONField with Pydantic models as a Schema

tests/conftest.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ class InnerSchema(pydantic.BaseModel):
1212
stub_int: int = 1
1313
stub_list: t.List[date]
1414

15+
class Config:
16+
allow_mutation = True
17+
frozen = False
18+
1519

1620
@dataclass
1721
class SampleDataclass:

tests/test_base_marshalling.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ def test_schema_wrapper_transformers():
7171
assert parsed_wrapper.__root__ == [expected_decoded]
7272

7373

74+
class test_schema_wrapper_config_inheritance():
75+
wrapper = base.SchemaWrapper()
76+
parsed_wrapper = wrapper._wrap_schema(InnerSchema, config={"allow_mutation": False})
77+
assert not parsed_wrapper.Config.allow_mutation
78+
assert not parsed_wrapper.Config.frozen
79+
80+
parsed_wrapper = wrapper._wrap_schema(t.List[InnerSchema], config={"frozen": True})
81+
assert parsed_wrapper.Config.allow_mutation
82+
assert parsed_wrapper.Config.frozen
83+
84+
7485
@pytest.mark.parametrize("type_, encoded, decoded", [
7586
(InnerSchema, '{"stub_str": "abc", "stub_list": ["2022-07-01"], "stub_int": 1}', InnerSchema(stub_str="abc", stub_list=[date(2022, 7, 1)])),
7687
(SampleDataclass, '{"stub_str": "abc", "stub_list": ["2022-07-01"], "stub_int": 1}', SampleDataclass(stub_str="abc", stub_list=[date(2022, 7, 1)])),

tests/test_django_model_field.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717

1818
class SampleModel(models.Model):
19-
sample_field: InnerSchema = fields.SchemaField()
19+
sample_field: InnerSchema = fields.SchemaField(config={"frozen": True, "allow_mutation": False})
2020
sample_list: t.List[InnerSchema] = fields.SchemaField()
2121
sample_seq: t.Sequence[InnerSchema] = fields.SchemaField(schema=t.List[InnerSchema])
2222

0 commit comments

Comments
 (0)