                          self._deleted = identity_to_objects.values()
  
                      self._errors = any(errors) and errors or []
              else:
                  ret = self.from_native(data, files)
  
              if not self._errors:
                  self.object = ret
  
 
</s> remove                 try:
                    iter(data)
                    if isinstance(data, dict):
                        raise TypeError
                except TypeError:
                    self._errors = {'non_field_errors': ['Expected a list of items']}
                else:
 </s> add                 if hasattr(data, '__iter__') and not isinstance(data, (dict, six.text_type)): </s> remove                             try:
                                identity = self.get_identity(item)
                            except:
                                self.object = None
                            else:
                                self.object = identity_to_objects.pop(identity, None)
 </s> add                             identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None) </s> remove                  context=None, partial=False, many=None, source=None):
 </s> add                  context=None, partial=False, many=None, source=None,
                 allow_delete=False):
                else:
                    self._errors = {'non_field_errors': ['Expected a list of items']}
                          self._deleted = identity_to_objects.values()
  
                      self._errors = any(errors) and errors or []
                else:
                    self._errors = {'non_field_errors': ['Expected a list of items']}
              else:
                  ret = self.from_native(data, files)
  
              if not self._errors:
                  self.object = ret
  
keep keep add keep keep keep keep keep keep
 Bit of extra tidying and plenty of docs 
rest_framework/serializers.py