diff options
| author | Ryan Kaskel | 2013-05-18 16:21:18 +0100 |
|---|---|---|
| committer | Ryan Kaskel | 2013-05-18 16:21:18 +0100 |
| commit | 10e451a85a034d1158148f54e98147e81454c2ed (patch) | |
| tree | 26bfe32b6ebbf7fb1083bea6b847ed64542b4ef9 | |
| parent | ef383d969c440a20fdf25748de590e07cb1abfda (diff) | |
| download | django-rest-framework-10e451a85a034d1158148f54e98147e81454c2ed.tar.bz2 | |
Handle Python 3 strings and lazy strings.
| -rw-r--r-- | rest_framework/fields.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 2ab603cf..c3ac6281 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -19,6 +19,7 @@ from django.db.models.fields import BLANK_CHOICE_DASH from django import forms from django.forms import widgets from django.utils.encoding import is_protected_type +from django.utils.functional import Promise from django.utils.translation import ugettext_lazy as _ from django.utils.datastructures import SortedDict @@ -45,6 +46,15 @@ def is_simple_callable(obj): len_defaults = len(defaults) if defaults else 0 return len_args <= len_defaults +if six.PY3: + def is_non_str_iterable(obj): + if (isinstance(obj, str) or + (isinstance(obj, Promise) and obj._delegate_text)): + return False + return hasattr(obj, '__iter__') +else: + def is_non_str_iterable(obj): + return hasattr(obj, '__iter__') def get_component(obj, attr_name): """ @@ -169,7 +179,8 @@ class Field(object): if is_protected_type(value): return value - elif hasattr(value, '__iter__') and not isinstance(value, (dict, six.string_types)): + elif (is_non_str_iterable(value) and + not isinstance(value, (dict, six.string_types))): return [self.to_native(item) for item in value] elif isinstance(value, dict): # Make sure we preserve field ordering, if it exists |
