aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-11-13 19:28:57 +0000
committerTom Christie2014-11-13 19:28:57 +0000
commitea98de9b889173235a908ee2ce5a2aba5d8223c7 (patch)
tree0ef008f76582c86c166191748b00406c42fd053a
parent9e75c4d8eab11d1637d65a8a7683f7970a41111b (diff)
downloaddjango-rest-framework-ea98de9b889173235a908ee2ce5a2aba5d8223c7.tar.bz2
Model fields with .blank or .null now map to required=False. Closes #2017. Closes #2021.
-rw-r--r--docs/topics/3.0-announcement.md6
-rw-r--r--rest_framework/utils/field_mapping.py2
-rw-r--r--tests/test_model_serializer.py6
3 files changed, 7 insertions, 7 deletions
diff --git a/docs/topics/3.0-announcement.md b/docs/topics/3.0-announcement.md
index d3da0607..885fc183 100644
--- a/docs/topics/3.0-announcement.md
+++ b/docs/topics/3.0-announcement.md
@@ -506,9 +506,9 @@ We now use the following:
REST framework now has more explicit and clear control over validating empty values for fields.
-Previously the meaning of the `required=False` keyword argument was underspecified. In practice its use meant that a field could either be not included in the input, or it could be included, but be `None`.
+Previously the meaning of the `required=False` keyword argument was underspecified. In practice its use meant that a field could either be not included in the input, or it could be included, but be `None` or the empty string.
-We now have a better separation, with separate `required` and `allow_none` arguments.
+We now have a better separation, with separate `required`, `allow_none` and `allow_blank` arguments.
The following set of arguments are used to control validation of empty values:
@@ -519,7 +519,7 @@ The following set of arguments are used to control validation of empty values:
Typically you'll want to use `required=False` if the corresponding model field has a default value, and additionally set either `allow_none=True` or `allow_blank=True` if required.
-The `default` argument is there if you need it, but you'll more typically want defaults to be set on model fields, rather than serializer fields.
+The `default` argument is also available and always implies that the field is not required to be in the input. It is unnecessary to use the `required` argument when a default is specified, and doing so will result in an error.
#### Coercing output types.
diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py
index 24639085..ce339971 100644
--- a/rest_framework/utils/field_mapping.py
+++ b/rest_framework/utils/field_mapping.py
@@ -88,7 +88,7 @@ def get_field_kwargs(field_name, model_field):
kwargs['read_only'] = True
return kwargs
- if model_field.has_default():
+ if model_field.has_default() or model_field.blank or model_field.null:
kwargs['required'] = False
if model_field.flatchoices:
diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py
index b8b621be..3aec0da0 100644
--- a/tests/test_model_serializer.py
+++ b/tests/test_model_serializer.py
@@ -90,7 +90,7 @@ class TestRegularFieldMappings(TestCase):
email_field = EmailField(max_length=100)
float_field = FloatField()
integer_field = IntegerField()
- null_boolean_field = NullBooleanField()
+ null_boolean_field = NullBooleanField(required=False)
positive_integer_field = IntegerField()
positive_small_integer_field = IntegerField()
slug_field = SlugField(max_length=100)
@@ -112,8 +112,8 @@ class TestRegularFieldMappings(TestCase):
id = IntegerField(label='ID', read_only=True)
value_limit_field = IntegerField(max_value=10, min_value=1)
length_limit_field = CharField(max_length=12, min_length=3)
- blank_field = CharField(allow_blank=True, max_length=10)
- null_field = IntegerField(allow_null=True)
+ blank_field = CharField(allow_blank=True, max_length=10, required=False)
+ null_field = IntegerField(allow_null=True, required=False)
default_field = IntegerField(required=False)
descriptive_field = IntegerField(help_text='Some help text', label='A label')
choices_field = ChoiceField(choices=[('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')])