          if restored_object is None:
              return
  
          self.perform_model_validation(restored_object)
          return restored_object
  
      def perform_model_validation(self, restored_object):
          try:
              # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
              restored_object.full_clean(exclude=list(self.opts.exclude))
 
</s> remove     def from_native(self, data, files):
        restored_object = super(ModelSerializer, self).from_native(data, files)

        if restored_object is None:
            return

 </s> add     def validate(self, attrs):
        copied_attrs = copy.deepcopy(attrs)
        restored_object = self.restore_object(copied_attrs, instance=getattr(self, 'object', None)) </s> remove         try:
            # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
            restored_object.full_clean(exclude=list(self.opts.exclude))
        except ValidationError as e:
            for field_name, error_messages in e.message_dict.items():
                self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages)
 </s> add         # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
        restored_object.full_clean(exclude=list(self.opts.exclude)) </s> remove         try:
            attrs = self.validate(attrs)
        except ValidationError as err:
            self._errors['non_field_errors'] = err.messages
 </s> add         # We don't run .validate() because field-validation failed and thus `attrs` may not be complete.
        # which in turn can cause inconsistent validation errors.
        if not self._errors:
            try:
                attrs = self.validate(attrs)
            except ValidationError as err:
                if hasattr(err, 'message_dict'):
                    for field_name, error_messages in err.message_dict.items():
                        self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages)
                elif hasattr(err, 'messages'):
                    self._errors['non_field_errors'] = err.messages
        return attrs
          if restored_object is None:
              return
  
          self.perform_model_validation(restored_object)
        return attrs
  
      def perform_model_validation(self, restored_object):
          try:
              # Call Django's full_clean() which in turn calls: Model.clean_fields(), Model.clean(), Model.validat_unique()
              restored_object.full_clean(exclude=list(self.opts.exclude))
keep keep keep keep replace keep keep keep keep keep
 Moved model validation from .perform_validation() to .validate() 
rest_framework/serializers.py