diff options
| author | Xavier Ordoquy | 2014-03-31 07:49:23 +0200 | 
|---|---|---|
| committer | Xavier Ordoquy | 2014-03-31 07:49:23 +0200 | 
| commit | 73cd4e236f0c119f5b6e0baad1259142fe37ace1 (patch) | |
| tree | e6ba3be5fd3df1e9c82434f8cb1856ad6a8f1ad4 | |
| parent | 2a27674a7971a60050d4530a0852a864b2065adb (diff) | |
| parent | f5fc6937ece8c2bc70088979cc19c2c0a660c7a0 (diff) | |
| download | django-rest-framework-73cd4e236f0c119f5b6e0baad1259142fe37ace1.tar.bz2 | |
Merge pull request #1477 from vlastv/patch-1
Writable star source with instance
| -rw-r--r-- | rest_framework/serializers.py | 20 | ||||
| -rw-r--r-- | rest_framework/tests/test_serializer.py | 26 | 
2 files changed, 36 insertions, 10 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 88972e25..cb7539e0 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -438,16 +438,6 @@ class BaseSerializer(WritableField):                      raise ValidationError(self.error_messages['required'])                  return -        # Set the serializer object if it exists -        obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None - -        # If we have a model manager or similar object then we need -        # to iterate through each instance. -        if (self.many and -            not hasattr(obj, '__iter__') and -            is_simple_callable(getattr(obj, 'all', None))): -            obj = obj.all() -          if self.source == '*':              if value:                  reverted_data = self.restore_fields(value, {}) @@ -457,6 +447,16 @@ class BaseSerializer(WritableField):              if value in (None, ''):                  into[(self.source or field_name)] = None              else: +                # Set the serializer object if it exists +                obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None + +                # If we have a model manager or similar object then we need +                # to iterate through each instance. +                if (self.many and +                    not hasattr(obj, '__iter__') and +                    is_simple_callable(getattr(obj, 'all', None))): +                    obj = obj.all() +                  kwargs = {                      'instance': obj,                      'data': value, diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 85a899c5..3ee2b38a 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -508,6 +508,32 @@ class ValidationTests(TestCase):          )          self.assertEqual(serializer.is_valid(), True) +    def test_writable_star_source_on_nested_serializer_with_parent_object(self): +        class TitleSerializer(serializers.Serializer): +            title = serializers.WritableField(source='title') + +        class AlbumSerializer(serializers.ModelSerializer): +            nested = TitleSerializer(source='*') + +            class Meta: +                model = Album +                fields = ('nested',) + +        class PhotoSerializer(serializers.ModelSerializer): +            album = AlbumSerializer(source='album') + +            class Meta: +                model = Photo +                fields = ('album', ) + +        photo = Photo(album=Album()) + +        data = {'album': {'nested': {'title': 'test'}}} + +        serializer = PhotoSerializer(photo, data=data) +        self.assertEqual(serializer.is_valid(), True) +        self.assertEqual(serializer.data, data) +      def test_writable_star_source_with_inner_source_fields(self):          """          Tests that a serializer with source="*" correctly expands the  | 
