From 1ba4dad44704d2b09050a992851b3e6b75736ee2 Mon Sep 17 00:00:00 2001 From: Alan Braithwaite Date: Wed, 2 Apr 2014 15:16:07 -0700 Subject: [PATCH] Functionality to convert field names on objects Added the necessary functionality for translating fields to have different names between the frontend and backend. --- rest_framework/serializers.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index cb7539e0b..0529874c0 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -264,6 +264,15 @@ class BaseSerializer(WritableField): """ return field_name + def get_field_name_map(self): + """ + Return a map of serialized->python field names + """ + ret = SortedDict() + for name, value in list(self.fields.items()): + ret[self.get_field_key(name)] = name + return ret + def restore_fields(self, data, files): """ Core of deserialization, together with `restore_object`. @@ -275,10 +284,20 @@ class BaseSerializer(WritableField): self._errors['non_field_errors'] = ['Invalid data'] return None + translated_data = SortedDict() + field_name_map = self.get_field_name_map() + for k,v in data.items(): + try: + python_field = field_name_map[k] + except KeyError: + pass + else: + translated_data[python_field] = v + for field_name, field in self.fields.items(): field.initialize(parent=self, field_name=field_name) try: - field.field_from_native(data, files, field_name, reverted_data) + field.field_from_native(translated_data, files, field_name, reverted_data) except ValidationError as err: self._errors[field_name] = list(err.messages) @@ -757,9 +776,9 @@ class ModelSerializer(Serializer): field.read_only = True ret[accessor_name] = field - + # Ensure that 'read_only_fields' is an iterable - assert isinstance(self.opts.read_only_fields, (list, tuple)), '`read_only_fields` must be a list or tuple' + assert isinstance(self.opts.read_only_fields, (list, tuple)), '`read_only_fields` must be a list or tuple' # Add the `read_only` flag to any fields that have been specified # in the `read_only_fields` option @@ -774,10 +793,10 @@ class ModelSerializer(Serializer): "on serializer '%s'." % (field_name, self.__class__.__name__)) ret[field_name].read_only = True - + # Ensure that 'write_only_fields' is an iterable - assert isinstance(self.opts.write_only_fields, (list, tuple)), '`write_only_fields` must be a list or tuple' - + assert isinstance(self.opts.write_only_fields, (list, tuple)), '`write_only_fields` must be a list or tuple' + for field_name in self.opts.write_only_fields: assert field_name not in self.base_fields.keys(), ( "field '%s' on serializer '%s' specified in " @@ -788,7 +807,7 @@ class ModelSerializer(Serializer): "Non-existant field '%s' specified in `write_only_fields` " "on serializer '%s'." % (field_name, self.__class__.__name__)) - ret[field_name].write_only = True + ret[field_name].write_only = True return ret