@@ -441,6 +441,30 @@ def run_validation(self, data=empty):
441
441
442
442
return value
443
443
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
+
444
468
def to_internal_value (self , data ):
445
469
"""
446
470
Dict of native values <- Dict of primitive datatypes.
@@ -1477,6 +1501,12 @@ def get_unique_together_validators(self):
1477
1501
if (field .source != '*' ) and ('.' not in field .source )
1478
1502
}
1479
1503
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
+
1480
1510
# Note that we make sure to check `unique_together` both on the
1481
1511
# base model class, but also on any parent classes.
1482
1512
validators = []
0 commit comments