From 49da11b0bf13ec6c62aab863ba5d82b931d3cbd6 Mon Sep 17 00:00:00 2001 From: Ian Strachan Date: Thu, 1 Nov 2012 21:31:29 +0000 Subject: [PATCH 1/2] Failing tests for RelatedFields with blank=True when blank value is supplied --- rest_framework/tests/models.py | 5 +++++ rest_framework/tests/serializer.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py index 415e4d062..e5832dbeb 100644 --- a/rest_framework/tests/models.py +++ b/rest_framework/tests/models.py @@ -126,3 +126,8 @@ class Person(RESTFrameworkModel): # Model for issue #324 class BlankFieldModel(RESTFrameworkModel): title = models.CharField(max_length=100, blank=True) + + +class BlankRelatedFieldModel(RESTFrameworkModel): + blank_field = models.OneToOneField('BasicModel', blank=True, null=True) + diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index d4b43862f..18c8990b3 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -498,3 +498,17 @@ class BlankFieldTests(TestCase): """ serializer = self.not_blank_model_serializer_class(self.data) self.assertEquals(serializer.is_valid(), False) + + +class BlankRelatedFieldModelTests(TestCase): + def setUp(self): + class BlankRelatedFieldModelSerializer(serializers.ModelSerializer): + class Meta: + model = BlankRelatedFieldModel + + self.serializer_class = BlankRelatedFieldModelSerializer + self.data = {'blank_field': None} + + def test_create_blank_related_field(self): + serializer = self.serializer_class(self.data) + self.assertEquals(serializer.is_valid(), True) From c5dfec8513f019306fed0ceaf5c52ab18688bcaf Mon Sep 17 00:00:00 2001 From: Ian Strachan Date: Sun, 4 Nov 2012 21:39:17 +0000 Subject: [PATCH 2/2] #356 Fixes issue with blank=True in related fields if related field is defined in serializer. Does not work for those from model. --- rest_framework/fields.py | 5 ++++- rest_framework/tests/serializer.py | 12 +++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 5b28463c5..2cb729e5e 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -313,7 +313,10 @@ class RelatedField(WritableField): return value = data.get(field_name) - into[(self.source or field_name)] = self.from_native(value) + if self.blank and value is None: + into[(self.source or field_name)] = None + else: + into[(self.source or field_name)] = self.from_native(value) class ManyRelatedMixin(object): diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 1e159a293..ac4f54ac9 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -3,7 +3,7 @@ from django.test import TestCase from rest_framework import serializers from rest_framework.tests.models import (ActionItem, Anchor, BasicModel, BlankFieldModel, BlogPost, CallableDefaultValueModel, DefaultValueModel, - ManyToManyModel, Person, ReadOnlyManyToManyModel) + ManyToManyModel, Person, ReadOnlyManyToManyModel, BlankRelatedFieldModel) class SubComment(object): @@ -525,13 +525,23 @@ class BlankFieldTests(TestCase): class BlankRelatedFieldModelTests(TestCase): def setUp(self): + class BlankInlineRelatedFieldModelSerializer(serializers.ModelSerializer): + blank_field = serializers.PrimaryKeyRelatedField(blank=True, queryset=BasicModel.objects.all()) + class Meta: + model = BlankRelatedFieldModel + class BlankRelatedFieldModelSerializer(serializers.ModelSerializer): class Meta: model = BlankRelatedFieldModel + self.inline_serializer_class = BlankInlineRelatedFieldModelSerializer self.serializer_class = BlankRelatedFieldModelSerializer self.data = {'blank_field': None} + def test_create_inline_blank_related_field(self): + serializer = self.inline_serializer_class(self.data) + self.assertEquals(serializer.is_valid(), True) + def test_create_blank_related_field(self): serializer = self.serializer_class(self.data) self.assertEquals(serializer.is_valid(), True)