@@ -441,6 +441,30 @@ def run_validation(self, data=empty):
441441
442442 return value
443443
444+ def _read_only_defaults (self ):
445+ fields = [
446+ field for field in self .fields .values ()
447+ if (field .read_only ) and (field .default != empty ) and (field .source != '*' ) and ('.' not in field .source )
448+ ]
449+
450+ defaults = OrderedDict ()
451+ for field in fields :
452+ try :
453+ default = field .get_default ()
454+ except SkipField :
455+ continue
456+ defaults [field .field_name ] = default
457+
458+ return defaults
459+
460+ def run_validators (self , value ):
461+ """
462+ Add read_only fields with defaults to value before running validators.
463+ """
464+ to_validate = self ._read_only_defaults ()
465+ to_validate .update (value )
466+ super (Serializer , self ).run_validators (to_validate )
467+
444468 def to_internal_value (self , data ):
445469 """
446470 Dict of native values <- Dict of primitive datatypes.
@@ -1477,6 +1501,12 @@ def get_unique_together_validators(self):
14771501 if (field .source != '*' ) and ('.' not in field .source )
14781502 }
14791503
1504+ # Special Case: Add read_only fields with defaults.
1505+ field_names |= {
1506+ field .source for field in self .fields .values ()
1507+ if (field .read_only ) and (field .default != empty ) and (field .source != '*' ) and ('.' not in field .source )
1508+ }
1509+
14801510 # Note that we make sure to check `unique_together` both on the
14811511 # base model class, but also on any parent classes.
14821512 validators = []
0 commit comments