Skip to content

Commit 7481681

Browse files
committed
Merge pull request #83 from oxan/metadata-child-kwargs
2 parents c16315c + 831ca78 commit 7481681

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Features & fixes:
1515
* Support dataclasses with fields that have ``init=False``.
1616
* Support ``save()`` on serializers with ``many=True``.
1717
* Support for fields with union types.
18+
* Fix ``child_kwargs`` defined in dataclass field metadata (as opposed to ``extra_kwargs`` field on ``Meta`` subclass).
1819

1920
1.2.0, 18 November 2022
2021
-----------------------

rest_framework_dataclasses/serializers.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,12 +376,11 @@ def create_field(self, field_name: str, extra_kwargs: KWArgs) -> SerializerField
376376
# Determine the serializer field class and keyword arguments.
377377
if source in self.dataclass_definition.fields:
378378
field = self.dataclass_definition.fields[source]
379+
if 'serializer_kwargs' in field.metadata: # merge extra kwargs defined in the field metadata
380+
extra_kwargs = {**field.metadata['serializer_kwargs'], **extra_kwargs}
381+
379382
type_info = field_utils.get_type_info(self.dataclass_definition.field_types[source])
380383
field_class, field_kwargs = self.build_typed_field(source, type_info, extra_kwargs)
381-
382-
# Include extra kwargs defined in the field metadata
383-
if 'serializer_kwargs' in field.metadata:
384-
field_kwargs = self.include_extra_kwargs(field_kwargs, field.metadata['serializer_kwargs'])
385384
elif hasattr(self.dataclass_definition.dataclass_type, source):
386385
field_class, field_kwargs = self.build_property_field(source)
387386
else:

tests/test_serializers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,9 @@ def test_create_field(self):
323323
class TestPerson:
324324
name: str
325325
length: int = dataclasses.field(metadata={'serializer_kwargs': {'max_value': 200}})
326+
numbers: typing.List[int] = dataclasses.field(metadata={
327+
'serializer_kwargs': {'child_kwargs': {'max_value': 200}}
328+
})
326329
species: types.Final[str] = 'Human'
327330

328331
def age(self) -> int:
@@ -345,6 +348,11 @@ def is_child(self) -> bool:
345348
self.assertIsInstance(length_field, fields.IntegerField)
346349
self.assertEqual(length_field.max_value, 200)
347350

351+
# Composite field with metadata argument for child field
352+
numbers_field = serializer.create_field('numbers', {})
353+
self.assertIsInstance(numbers_field.child, fields.IntegerField)
354+
self.assertEqual(numbers_field.child.max_value, 200)
355+
348356
# Function field
349357
age_field = serializer.create_field('age', {})
350358
self.assertIsInstance(age_field, fields.ReadOnlyField)

0 commit comments

Comments
 (0)