def save(self):
        self.deserialize()
        if self.errors:
            raise ModelValidationError(self.errors)
        try:
            self.instance.clean_fields()
        except ValidationError as e:
            raise ModelValidationError(e.message_dict)
        self.instance.save()

        # Serialize related fields
        for key, val in self.data.items():
            if key not in self.related_fields:
                continue
            self._deserialize_related(key, val)

        # Serialize m2m fields
        for key, val in self.data.items():
            if key not in self.m2m_fields:
                continue
            self._deserialize_related(key, val, save_instance=True)
        return self.instance
    def deserialize(self):
        # Set initial data
        if not self._instance:
            self._instance = self.opts.model()

        for key, val in self.initial.items():
            setattr(self.instance, key, val)

        # Deserialize base fields
        for key, val in self.data.items():
            if key not in self.opts.update_fields or key not in self.base_fields:
                continue
            try:
                self.validate_field(key, val, self.data)
                self._deserialize_field(key, val)
            except ModelValidationError as err:
                self.errors.update(err.get_error_dict())

        if self.errors:
            raise ModelValidationError(errors=self.errors)

        return self.instance
 def validate_number(self, val):
     if val == 8:
         raise ModelValidationError({'number': ['number error']})
 def validate_text(self, val):
     if val == 'foo':
         raise ModelValidationError({'text': ['text error']})