          for k, v in self.choices:
              if isinstance(v, (list, tuple)):
                  # This is an optgroup, so look inside the group for options
                  for k2, v2 in v:
                      if value == smart_unicode(k2):
                          return True
              else:
                  if value == smart_unicode(k):
                      return True
          return False
 
</s> remove         elif hasattr(value, '__iter__') and not isinstance(value, (dict, basestring)):
 </s> add         elif hasattr(value, '__iter__') and not isinstance(value, (dict, six.string_types)): </s> remove     if isinstance(val, basestring):
 </s> add     if isinstance(val, string_types): </s> remove         return smart_unicode(value)
 </s> add         return smart_text(value) </s> remove         desc = smart_unicode(obj)
        ident = smart_unicode(self.to_native(obj))
 </s> add         desc = smart_text(obj)
        ident = smart_text(self.to_native(obj)) </s> remove         desc = smart_unicode(obj)
        ident = smart_unicode(self.to_native(obj.pk))
 </s> add         desc = smart_text(obj)
        ident = smart_text(self.to_native(obj.pk))
                    if value == smart_text(k2):
          for k, v in self.choices:
              if isinstance(v, (list, tuple)):
                  # This is an optgroup, so look inside the group for options
                  for k2, v2 in v:
                    if value == smart_text(k2):
                          return True
              else:
                  if value == smart_unicode(k):
                      return True
          return False
keep keep keep keep replace keep keep keep keep keep
 First passing test under p3k \o/ 
rest_framework/fields.py