From bdf66a20e596e65b19133ff82e4262e43bc53c4f Mon Sep 17 00:00:00 2001 From: Oxan van Leeuwen Date: Sat, 23 Oct 2021 21:26:23 +0200 Subject: [PATCH] Allow dataclasses mapped to foreign serializer Previously, when dataclass types were present in the serializer field mapping, they were required to map to a DataclassSerializer type, because the serializer would always receive the `dataclass` argument. Remove this restriction. Fixes #46. --- rest_framework_dataclasses/serializers.py | 4 ++++ tests/test_field_generation.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/rest_framework_dataclasses/serializers.py b/rest_framework_dataclasses/serializers.py index 19db4dd..aecc2b2 100644 --- a/rest_framework_dataclasses/serializers.py +++ b/rest_framework_dataclasses/serializers.py @@ -502,6 +502,10 @@ def build_dataclass_field(self, field_name: str, type_info: TypeInfo) -> Seriali except KeyError: field_class = self.serializer_dataclass_field + # allow user to map a dataclass to a regular serializer Field class + if not issubclass(field_class, DataclassSerializer): + return self.build_standard_field(field_name, type_info) + field_kwargs = {'dataclass': type_info.base_type, 'many': type_info.is_many} diff --git a/tests/test_field_generation.py b/tests/test_field_generation.py index 566004a..c242659 100644 --- a/tests/test_field_generation.py +++ b/tests/test_field_generation.py @@ -127,6 +127,10 @@ def test_nested(self): DataclassSerializer.serializer_field_mapping[refclass] = subclassed_serializer self.check_field(refclass, subclassed_serializer, {'dataclass': refclass, 'many': False}) + # customizing the dataclass serializer by putting regular Field in the field mapping + DataclassSerializer.serializer_field_mapping[refclass] = fields.CharField + self.check_field(refclass, fields.CharField, {}) + def test_relational(self): django.setup()