diff options
| author | Tom Christie | 2014-02-28 09:27:27 +0000 | 
|---|---|---|
| committer | Tom Christie | 2014-02-28 09:27:27 +0000 | 
| commit | c3c69f4304b834f816bac847520faf170f2a1340 (patch) | |
| tree | 52340495dbbccf66c022d0615dd29b5dd0d75a60 /rest_framework | |
| parent | 1a75e7b02b5c838cb7b4b3124c4f6b5873c00c91 (diff) | |
| parent | f126856f65aa86de2c4cc1b1e3bb6a52cebb34b8 (diff) | |
| download | django-rest-framework-c3c69f4304b834f816bac847520faf170f2a1340.tar.bz2 | |
Merge pull request #1441 from dustinfarris/null-serialization
TestCases and POST/PUT'ing serialized data that contains `None`
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/relations.py | 7 | ||||
| -rw-r--r-- | rest_framework/tests/serializers.py | 8 | ||||
| -rw-r--r-- | rest_framework/tests/test_nullable_fields.py | 30 | ||||
| -rw-r--r-- | rest_framework/tests/views.py | 8 | 
4 files changed, 50 insertions, 3 deletions
diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 02185c2f..163a8984 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -33,6 +33,7 @@ class RelatedField(WritableField):      many_widget = widgets.SelectMultiple      form_field_class = forms.ChoiceField      many_form_field_class = forms.MultipleChoiceField +    null_values = (None, '', 'None')      cache_choices = False      empty_label = None @@ -168,9 +169,9 @@ class RelatedField(WritableField):                  return              value = [] if self.many else None -        if value in (None, '') and self.required: -            raise ValidationError(self.error_messages['required']) -        elif value in (None, ''): +        if value in self.null_values: +            if self.required: +                raise ValidationError(self.error_messages['required'])              into[(self.source or field_name)] = None          elif self.many:              into[(self.source or field_name)] = [self.from_native(item) for item in value] diff --git a/rest_framework/tests/serializers.py b/rest_framework/tests/serializers.py new file mode 100644 index 00000000..cc943c7d --- /dev/null +++ b/rest_framework/tests/serializers.py @@ -0,0 +1,8 @@ +from rest_framework import serializers + +from rest_framework.tests.models import NullableForeignKeySource + + +class NullableFKSourceSerializer(serializers.ModelSerializer): +    class Meta: +        model = NullableForeignKeySource diff --git a/rest_framework/tests/test_nullable_fields.py b/rest_framework/tests/test_nullable_fields.py new file mode 100644 index 00000000..6ee55c00 --- /dev/null +++ b/rest_framework/tests/test_nullable_fields.py @@ -0,0 +1,30 @@ +from django.core.urlresolvers import reverse + +from rest_framework.compat import patterns, url +from rest_framework.test import APITestCase +from rest_framework.tests.models import NullableForeignKeySource +from rest_framework.tests.serializers import NullableFKSourceSerializer +from rest_framework.tests.views import NullableFKSourceDetail + + +urlpatterns = patterns( +    '', +    url(r'^objects/(?P<pk>\d+)/$', NullableFKSourceDetail.as_view(), name='object-detail'), +) + + +class NullableForeignKeyTests(APITestCase): +    """ +    DRF should be able to handle nullable foreign keys when a test +    Client POST/PUT request is made with its own serialized object. +    """ +    urls = 'rest_framework.tests.test_nullable_fields' + +    def test_updating_object_with_null_fk(self): +        obj = NullableForeignKeySource(name='example', target=None) +        obj.save() +        serialized_data = NullableFKSourceSerializer(obj).data + +        response = self.client.put(reverse('object-detail', args=[obj.pk]), serialized_data) + +        self.assertEqual(response.data, serialized_data) diff --git a/rest_framework/tests/views.py b/rest_framework/tests/views.py new file mode 100644 index 00000000..3917b74a --- /dev/null +++ b/rest_framework/tests/views.py @@ -0,0 +1,8 @@ +from rest_framework import generics +from rest_framework.tests.models import NullableForeignKeySource +from rest_framework.tests.serializers import NullableFKSourceSerializer + + +class NullableFKSourceDetail(generics.RetrieveUpdateDestroyAPIView): +    model = NullableForeignKeySource +    model_serializer_class = NullableFKSourceSerializer  | 
