1919
2020from rest_framework .exceptions import SkipError
2121from rest_framework .serializers .exceptions import ValidationError
22+ from rest_framework .serializers .helpers import get_class_name
2223from rest_framework .utils import html
2324from rest_framework .serializers .validators import (
2425 RequiredValidator , MaxLengthValidator , MinLengthValidator , MaxValueValidator , MinValueValidator
@@ -72,7 +73,7 @@ class Field(object):
7273 default_validators = [] # Default validators for field.
7374
7475 def __init__ (self , required = True , default = None , label = None , validators = None ,
75- error_messages = None , source = None ):
76+ error_messages = None , source = None , allow_none = None ):
7677 """
7778 Base field.
7879
@@ -82,11 +83,13 @@ def __init__(self, required=True, default=None, label=None, validators=None,
8283 :param list validators: Validators for field.
8384 :param dict error_messages: Dictionary with custom error description.
8485 :param str source: Source field_name, if field_name object other in serializer.
86+ :param bool allow_none: Allow None value in field?
8587
8688 """
8789 self .label = label
8890 self .default = default
8991 self .source = source
92+ self .allow_none = allow_none
9093 self .required = bool (required ) if self .default is None else False
9194 # Added validator for check on required field.
9295 self ._src_validators = validators
@@ -104,7 +107,7 @@ def __deepcopy__(self, memo={}):
104107 return self .__class__ (
105108 required = self .required , default = self .default , label = self .label ,
106109 validators = self ._src_validators , error_messages = self ._src_messages ,
107- source = self .source
110+ source = self .source , allow_none = self . allow_none
108111 )
109112
110113 def bind (self , field_name , parent ):
@@ -191,6 +194,20 @@ def to_internal_value(self, data):
191194 """
192195 raise NotImplementedError ('`to_internal_value()` must be implemented.' )
193196
197+ def _to_representation (self , value ):
198+ """
199+ Transformation an object to a valid JSON object.
200+
201+ :param object value: The object to transformation.
202+
203+ :return: Transformed data.
204+ :rtype: object
205+
206+ """
207+ if value is None and self .allow_none :
208+ return value
209+ return self .to_representation (value )
210+
194211 def to_representation (self , value ):
195212 """
196213 Transformation an object to a valid JSON object.
@@ -257,6 +274,8 @@ def get_attribute(self, instance):
257274 # If there is a default value, then it.
258275 if self .default is not None :
259276 return self .get_default ()
277+ if self .allow_none :
278+ return None
260279 # If there is no default and the field is required, we swear.
261280 if self .required :
262281 raise SkipError (self .error_messages ['required' ])
@@ -270,8 +289,8 @@ def get_attribute(self, instance):
270289 'Original exception text was: {exc}.' .format (
271290 exc_type = type (e ).__name__ ,
272291 field = self .field_name ,
273- serializer = self .parent . __name__ ,
274- instance = instance . __class__ . __name__ ,
292+ serializer = get_class_name ( self .parent ) ,
293+ instance = get_class_name ( instance ) ,
275294 exc = e
276295 )
277296 )
@@ -396,7 +415,7 @@ def __deepcopy__(self, memo={}):
396415 validators = self ._src_validators , error_messages = self ._src_messages ,
397416 min_length = self .min_length , max_length = self .max_length ,
398417 trim_whitespace = self .trim_whitespace , allow_blank = self .allow_blank ,
399- source = self .source
418+ source = self .source , allow_none = self . allow_none
400419 )
401420
402421 def run_validation (self , data = None ):
@@ -490,7 +509,7 @@ def __deepcopy__(self, memo={}):
490509 required = self .required , default = self .default , label = self .label ,
491510 validators = self ._src_validators , error_messages = self ._src_messages ,
492511 min_value = self .min_value , max_value = self .max_value ,
493- source = self .source
512+ source = self .source , allow_none = self . allow_none
494513 )
495514
496515 def to_internal_value (self , data ):
@@ -566,7 +585,7 @@ def __deepcopy__(self, memo={}):
566585 required = self .required , default = self .default , label = self .label ,
567586 validators = self ._src_validators , error_messages = self ._src_messages ,
568587 min_value = self .min_value , max_value = self .max_value ,
569- source = self .source
588+ source = self .source , allow_none = self . allow_none
570589 )
571590
572591 def to_internal_value (self , data ):
@@ -826,7 +845,7 @@ def __deepcopy__(self, memo={}):
826845 required = self .required , default = self .default , label = self .label ,
827846 validators = self ._src_validators , error_messages = self ._src_messages ,
828847 child = self .child , min_length = self .min_length , max_length = self .max_length ,
829- allow_empty = self .allow_empty , source = self .source
848+ allow_empty = self .allow_empty , source = self .source , allow_none = self . allow_none
830849 )
831850
832851 def to_internal_value (self , data ):
@@ -862,7 +881,7 @@ def to_representation(self, value):
862881 :rtype: list
863882
864883 """
865- return [self .child .to_representation (item ) if item is not None else None for item in (value or [])]
884+ return [self .child ._to_representation (item ) if item is not None else None for item in (value or [])]
866885
867886
868887class DateField (Field ):
@@ -897,7 +916,7 @@ def __deepcopy__(self, memo={}):
897916 required = self .required , default = self .default , label = self .label ,
898917 validators = self ._src_validators , error_messages = self ._src_messages ,
899918 format = getattr (self , 'format' ), input_format = getattr (self , 'input_format' ),
900- source = self .source
919+ source = self .source , allow_none = self . allow_none
901920 )
902921
903922 def to_internal_value (self , data ):
@@ -997,7 +1016,7 @@ def __deepcopy__(self, memo={}):
9971016 required = self .required , default = self .default , label = self .label ,
9981017 validators = self ._src_validators , error_messages = self ._src_messages ,
9991018 format = getattr (self , 'format' , None ), input_format = getattr (self , 'input_format' ),
1000- source = self .source
1019+ source = self .source , allow_none = self . allow_none
10011020 )
10021021
10031022 def to_internal_value (self , data ):
@@ -1095,7 +1114,7 @@ def __deepcopy__(self, memo={}):
10951114 required = self .required , default = self .default , label = self .label ,
10961115 validators = self ._src_validators , error_messages = self ._src_messages ,
10971116 format = getattr (self , 'format' ), input_format = getattr (self , 'input_format' ),
1098- source = self .source
1117+ source = self .source , allow_none = self . allow_none
10991118 )
11001119
11011120 def to_internal_value (self , data ):
@@ -1227,7 +1246,7 @@ def __deepcopy__(self, memo={}):
12271246 return self .__class__ (
12281247 required = self .required , default = self .default , label = self .label ,
12291248 validators = self ._src_validators , error_messages = self ._src_messages ,
1230- child = self .child , source = self .source
1249+ child = self .child , source = self .source , allow_none = self . allow_none
12311250 )
12321251
12331252 def to_internal_value (self , data ):
@@ -1264,7 +1283,7 @@ def to_representation(self, value):
12641283
12651284 """
12661285 return {
1267- six .text_type (key ): self .child .to_representation (val ) if val is not None else None
1286+ six .text_type (key ): self .child ._to_representation (val ) if val is not None else None
12681287 for key , val in six .iteritems (value )
12691288 }
12701289
@@ -1313,7 +1332,7 @@ def __deepcopy__(self, memo={}):
13131332 required = self .required , default = self .default , label = self .label ,
13141333 validators = self ._src_validators , error_messages = self ._src_messages ,
13151334 method_name_get = self .method_name_get , method_name_pop = self .method_name_pop ,
1316- source = self .source
1335+ source = self .source , allow_none = self . allow_none
13171336 )
13181337
13191338 def bind (self , field_name , parent ):
0 commit comments