diff options
| author | Tom Christie | 2012-12-23 10:48:35 -0800 | 
|---|---|---|
| committer | Tom Christie | 2012-12-23 10:48:35 -0800 | 
| commit | 0576241b191a61cb11ac879ff24e0c1cf9a79ca9 (patch) | |
| tree | 9d6a3d9c44283bea2d49255f1e17524701d37ecf /rest_framework | |
| parent | ab991199cb5825a4413e74aede874626f6ab9411 (diff) | |
| parent | f8a1256b1c006ee9ab46645a11ef19123b429a56 (diff) | |
| download | django-rest-framework-0576241b191a61cb11ac879ff24e0c1cf9a79ca9.tar.bz2 | |
Merge pull request #523 from maspwr/related-required
RelatedField should respect self.required
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/fields.py | 7 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 32 | 
2 files changed, 38 insertions, 1 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index f582a681..dd90c3f8 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -351,7 +351,12 @@ class RelatedField(WritableField):          if self.read_only:              return -        value = data.get(field_name) +        try: +            value = data[field_name] +        except KeyError: +            if self.required: +                raise ValidationError(self.error_messages['required']) +            return          if value in (None, '') and not self.null:              raise ValidationError('Value may not be null') diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 6ea4b424..f780e811 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -308,6 +308,38 @@ class ModelValidationTests(TestCase):          self.assertFalse(second_serializer.is_valid())          self.assertEqual(second_serializer.errors,  {'title': [u'Album with this Title already exists.']}) +    def test_foreign_key_with_partial(self): +        """ +        Test ModelSerializer validation with partial=True + +        Specifically test foreign key validation. +        """ + +        album = Album(title='test') +        album.save() + +        class PhotoSerializer(serializers.ModelSerializer): +            class Meta: +                model = Photo + +        photo_serializer = PhotoSerializer(data={'description': 'test', 'album': album.pk}) +        self.assertTrue(photo_serializer.is_valid()) +        photo = photo_serializer.save() + +        # Updating only the album (foreign key) +        photo_serializer = PhotoSerializer(instance=photo, data={'album': album.pk}, partial=True) +        self.assertTrue(photo_serializer.is_valid()) +        self.assertTrue(photo_serializer.save()) + +        # Updating only the description +        photo_serializer = PhotoSerializer(instance=photo, +                                           data={'description': 'new'}, +                                           partial=True) + +        self.assertTrue(photo_serializer.is_valid()) +        self.assertTrue(photo_serializer.save()) + +  class RegexValidationTest(TestCase):      def test_create_failed(self):  | 
