From be7183f196fd0313fba49a709eef7264fa9723df Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Thu, 13 Feb 2014 09:45:22 +0100 Subject: [PATCH] Altered the code to avoid spanning more than one relation. --- rest_framework/serializers.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 7838efbf8..5ee2536d2 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -950,24 +950,28 @@ class ModelSerializer(Serializer): # Update an existing instance... if instance is not None: for key, val in attrs.items(): - # Follow relations if needed - dest = instance keys = key.split('.') - try: - for related_instance in keys[:-1]: - dest = getattr(dest, related_instance) - except AttributeError: - self._errors[key] = self.error_messages['missing'] + # Work on the current instance for this attribute + attr_instance = instance + + # Raise an error if we span more than one relation + if len(keys) > 2: + self._errors[key] = 'Can not span more than a relation' continue - # If there's a relation, mark the object to save - if len(keys) > 1: - related_models_to_save[key] = dest + # Mark the related instance as the one to save + if len(keys) == 2: + try: + attr_instance = getattr(instance, keys[0]) + related_models_to_save[key] = attr_instance + except AttributeError: + self._errors[key] = self.error_messages['missing'] + continue # Assign the value try: - setattr(dest, keys[-1], val) + setattr(attr_instance, keys[-1], val) except ValueError: self._errors[key] = self.error_messages['required'] @@ -976,7 +980,6 @@ class ModelSerializer(Serializer): for key, value in ((k, v) for k, v in attrs.items() if '.' in k): self._errors[key] = 'You can not set dotted sources during creation.' del attrs[key] - print value instance = self.opts.model(**attrs) # Any relations that cannot be set until we've