aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/fields.py
diff options
context:
space:
mode:
authorTom Christie2012-10-02 19:54:24 +0100
committerTom Christie2012-10-02 19:54:24 +0100
commite1518de68fa9ad4b2628894abf17924e386ccbda (patch)
treeb1d190f6bd08ce087cf0a2d3e8cd681b5e7e7d04 /rest_framework/fields.py
parent31b06f1721f98730556dc56927b985e4032788c3 (diff)
parentd1b99f350aded62fe480f7dc4749cd63d52715d2 (diff)
downloaddjango-rest-framework-e1518de68fa9ad4b2628894abf17924e386ccbda.tar.bz2
Merge branch 'restframework2' of https://github.com/tomchristie/django-rest-framework into restframework2
Diffstat (limited to 'rest_framework/fields.py')
-rw-r--r--rest_framework/fields.py32
1 files changed, 12 insertions, 20 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index eab90617..85ee5430 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -139,7 +139,13 @@ class Field(object):
if hasattr(self, 'model_field'):
return self.to_native(self.model_field._get_val_from_obj(obj))
- return self.to_native(getattr(obj, self.source or field_name))
+ if self.source:
+ value = obj
+ for component in self.source.split('.'):
+ value = getattr(value, component)
+ else:
+ value = getattr(obj, field_name)
+ return self.to_native(value)
def to_native(self, value):
"""
@@ -152,6 +158,8 @@ class Field(object):
return value
elif hasattr(self, 'model_field'):
return self.model_field.value_to_string(self.obj)
+ elif hasattr(value, '__iter__') and not isinstance(value, (dict, basestring)):
+ return [self.to_native(item) for item in value]
return smart_unicode(value)
def attributes(self):
@@ -175,7 +183,7 @@ class RelatedField(Field):
"""
def field_to_native(self, obj, field_name):
- obj = getattr(obj, field_name)
+ obj = getattr(obj, self.source or field_name)
if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'):
return [self.to_native(item) for item in obj.all()]
return self.to_native(obj)
@@ -215,10 +223,10 @@ class PrimaryKeyRelatedField(RelatedField):
def field_to_native(self, obj, field_name):
try:
- obj = obj.serializable_value(field_name)
+ obj = obj.serializable_value(self.source or field_name)
except AttributeError:
field = obj._meta.get_field_by_name(field_name)[0]
- obj = getattr(obj, field_name)
+ obj = getattr(obj, self.source or field_name)
if obj.__class__.__name__ == 'RelatedManager':
return [self.to_native(item.pk) for item in obj.all()]
elif isinstance(field, RelatedObject):
@@ -431,19 +439,3 @@ class FloatField(Field):
except (TypeError, ValueError):
msg = self.error_messages['invalid'] % value
raise ValidationError(msg)
-
-# field_mapping = {
-# models.AutoField: IntegerField,
-# models.BooleanField: BooleanField,
-# models.CharField: CharField,
-# models.DateTimeField: DateTimeField,
-# models.DateField: DateField,
-# models.BigIntegerField: IntegerField,
-# models.IntegerField: IntegerField,
-# models.PositiveIntegerField: IntegerField,
-# models.FloatField: FloatField
-# }
-
-
-# def modelfield_to_serializerfield(field):
-# return field_mapping.get(type(field), Field)