class ConversionMixin: converters = [] def clean(self, raw_value): for converter in self.converters: raw_value = converter(raw_value) return super().clean(raw_value) def create_conversion_field(field, *new_converters): class NewConversionField(ConversionMixin, field): converters = new_converters def __reduce__(self): return (create_conversion_field, (field, new_converters)) NewConversionField.__name__ = 'Conversion{}'.format(field.__name__) return NewConversionField def with_converters(field, *converters, **field_kwargs): return partial(create_conversion_field(field, *converters), **field_kwargs)