                  else:
                      for item in data:
                          if update:
                              # Determine which object we're updating
                              try:
                                  identity = self.get_identity(item)
                              except:
                                  self.object = None
                              else:
                                  self.object = identity_to_objects.pop(identity, None)
  
                          ret.append(self.from_native(item, None))
                          errors.append(self._errors)
  
                      if update:
 
</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         if self._deleted:
 </s> add         if self.allow_delete and self._deleted: </s> remove                  context=None, partial=False, many=None, source=None):
 </s> add                  context=None, partial=False, many=None, source=None,
                 allow_delete=False):
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                  else:
                      for item in data:
                          if update:
                              # Determine which object we're updating
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
                            identity = self.get_identity(item)
                            self.object = identity_to_objects.pop(identity, None)
  
                          ret.append(self.from_native(item, None))
                          errors.append(self._errors)
  
                      if update:
keep keep keep keep replace replace replace replace replace replace keep keep keep keep keep
 Bit of extra tidying and plenty of docs 
rest_framework/serializers.py