From 52064cb5b52bb6a6f9e058cfc35fd80f30819040 Mon Sep 17 00:00:00 2001 From: st4lk Date: Tue, 3 Feb 2015 20:09:38 +0300 Subject: [PATCH] blank fields shall not be required --- rest_framework/utils/field_mapping.py | 4 ++-- tests/models.py | 11 +++++++++++ tests/test_relations_pk.py | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index c97ec5d0e..a43f61e87 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -223,9 +223,9 @@ def get_relation_kwargs(field_name, relation_info): # If this field is read-only, then return early. # No further keyword arguments are valid. return kwargs - if model_field.has_default() or model_field.null: + if model_field.has_default() or model_field.blank: kwargs['required'] = False - if model_field.null: + if model_field.blank: kwargs['allow_null'] = True if model_field.validators: kwargs['validators'] = model_field.validators diff --git a/tests/models.py b/tests/models.py index 456b0a0bb..b435be984 100644 --- a/tests/models.py +++ b/tests/models.py @@ -40,6 +40,17 @@ class ManyToManySource(RESTFrameworkModel): targets = models.ManyToManyField(ManyToManyTarget, related_name='sources') +class ManyToManyBlankedSource(RESTFrameworkModel): + """ + Some fields can be blank without being null + """ + name = models.CharField(max_length=100) + surname = models.CharField(max_length=100, blank=True) + story = models.TextField(blank=True) + targets = models.ManyToManyField(ManyToManyTarget, blank=True, + related_name='blank_sources') + + # ForeignKey class ForeignKeyTarget(RESTFrameworkModel): name = models.CharField(max_length=100) diff --git a/tests/test_relations_pk.py b/tests/test_relations_pk.py index f872a8dc5..94397ef29 100644 --- a/tests/test_relations_pk.py +++ b/tests/test_relations_pk.py @@ -5,6 +5,7 @@ from rest_framework import serializers from tests.models import ( ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource, + ManyToManyBlankedSource, ) @@ -21,6 +22,12 @@ class ManyToManySourceSerializer(serializers.ModelSerializer): fields = ('id', 'name', 'targets') +class ManyToManyBlankedSourceSerializer(serializers.ModelSerializer): + class Meta: + model = ManyToManyBlankedSource + fields = ('id', 'name', 'surname', 'story', 'targets') + + # ForeignKey class ForeignKeyTargetSerializer(serializers.ModelSerializer): class Meta: @@ -106,6 +113,17 @@ class PKManyToManyTests(TestCase): ] self.assertEqual(serializer.data, expected) + def test_many_to_many_blanked_retrieve(self): + data = {'id': 1, 'name': 'source-1-updated'} + instance = ManyToManyBlankedSource(name='source-%d' % data['id']) + instance.save() + serializer = ManyToManyBlankedSourceSerializer(instance, data=data) + self.assertTrue(serializer.is_valid()) + serializer.save() + # set default values + data.update({'targets': [], 'surname': '', 'story': ''}) + self.assertEqual(serializer.data, data) + def test_reverse_many_to_many_update(self): data = {'id': 1, 'name': 'target-1', 'sources': [1]} instance = ManyToManyTarget.objects.get(pk=1)