Add compound field types

This commit is contained in:
Steven Cummings 2013-12-12 00:42:08 -06:00
parent 75e8724731
commit 0e8760eaaf
2 changed files with 76 additions and 1 deletions

View File

@ -1012,3 +1012,78 @@ class SerializerMethodField(Field):
def field_to_native(self, obj, field_name): def field_to_native(self, obj, field_name):
value = getattr(self.parent, self.method_name)(obj) value = getattr(self.parent, self.method_name)(obj)
return self.to_native(value) return self.to_native(value)
##### Compound Typed Fields #####
class ListField(WritableField):
"""
A field whose values are lists of items described by the given item field. The item field can
be another field type (e.g., CharField) or a serializer.
"""
def __init__(self, item_field, *args, **kwargs):
super(ListField, self).__init__(*args, **kwargs)
self.item_field = item_field
def to_native(self, obj):
if obj:
return [
self.item_field.to_native(item)
for item in obj
]
def from_native(self, data):
if data:
return [
self.item_field.from_native(item_data)
for item_data in data
]
class ListOrObjectField(WritableField):
"""
A field whose values are either objects or lists of items described by the given item field.
The item field can be another field type (e.g., CharField) or a serializer.
"""
def __init__(self, item_field, *args, **kwargs):
super(ListOrObjectField, self).__init__(*args, **kwargs)
self.item_field = item_field
self.list_field = ListField(item_field)
def to_native(self, obj):
if isinstance(obj, list):
return self.list_field.to_native(obj)
return self.item_field.to_native(obj)
def from_native(self, data):
if isinstance(obj, list):
return self.list_field.from_native(obj)
return self.item_field.from_native(obj)
class DictField(WritableField):
"""
A field whose values are dicts of values described by the given value field. The value field
can be another field type (e.g., CharField) or a serializer.
"""
def __init__(self, value_field, *args, **kwargs):
super(DictField, self).__init__(*args, **kwargs)
self.value_field = value_field
def to_native(self, obj):
if obj:
return {
key:self.value_field.to_native(value)
for key, value in obj.items()
}
def from_native(self, data):
if data:
return {
key:self.value_field.from_native(value)
for key, value in data.items()
}

View File

@ -331,7 +331,7 @@ class BaseSerializer(WritableField):
return ret return ret
def from_native(self, data, files): def from_native(self, data, files=None):
""" """
Deserialize primitives -> objects. Deserialize primitives -> objects.
""" """