blank fields shall not be required

This commit is contained in:
st4lk 2015-02-03 20:09:38 +03:00
parent 33cfc2e486
commit 52064cb5b5
3 changed files with 31 additions and 2 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)