Example #1
0
    def build_dataclass_field(self, field_name: str, type_info: TypeInfo) -> SerializerFieldDefinition:
        """
        Create fields for dataclasses.
        """
        try:
            field_class = field_utils.lookup_type_in_mapping(self.serializer_field_mapping, type_info.base_type)
        except KeyError:
            field_class = self.serializer_dataclass_field

        field_kwargs = {'dataclass': type_info.base_type,
                        'many': type_info.is_many}

        return field_class, field_kwargs
    def build_standard_field(self, field_name: str, type_info: TypeInfo) -> SerializerFieldDefinition:
        """
        Create regular dataclass fields.
        """
        try:
            field_class = field_utils.lookup_type_in_mapping(self.serializer_field_mapping, type_info.base_type)
            field_kwargs = {}

            return field_class, field_kwargs
        except KeyError:
            # When resolving the type hint fails, raise a nice descriptive error based on the outermost type of the
            # field (this makes solving deep recursive errors much easier).
            field_type = self.dataclass_definition.field_types[field_name]
            raise NotImplementedError(
                "Automatic serializer field deduction not supported for field '{field}' on '{dataclass}' "
                "of type '{type}'."
                .format(dataclass=self.dataclass_definition.dataclass_type.__name__, field=field_name, type=field_type)
            )
Example #3
0
    def build_dataclass_field(
            self, field_name: str,
            type_info: TypeInfo) -> SerializerFieldDefinition:
        """
        Create fields for dataclasses.
        """
        try:
            field_class = field_utils.lookup_type_in_mapping(
                self.serializer_field_mapping, type_info.base_type)
        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
        }

        return field_class, field_kwargs