Skip to content

Instantly share code, notes, and snippets.

@sergeybe
Created November 25, 2015 07:32
Show Gist options
  • Save sergeybe/489d3847aa7185f5b8b6 to your computer and use it in GitHub Desktop.
Save sergeybe/489d3847aa7185f5b8b6 to your computer and use it in GitHub Desktop.
Read and write field wrapper for Django REST Framework
class ReadWriteMethodField(fields.Field):
""" Read and write method field for DFR """
def __init__(self, field_type=fields.Field, get_method_name=None, put_method_name=None, **kwargs):
self.field_type = field_type
self.get_method_name = get_method_name
self.put_method_name = put_method_name
self._field = field_type(**kwargs)
kwargs['read_only'] = False
kwargs['source'] = '*'
super(ReadWriteMethodField, self).__init__(**kwargs)
def bind(self, field_name, parent):
default_get_method_name = 'get_{field_name}'.format(field_name=field_name)
default_put_method_name = 'put_{field_name}'.format(field_name=field_name)
if self.get_method_name is None:
self.get_method_name = default_get_method_name
if self.put_method_name is None:
self.put_method_name = default_put_method_name
super(ReadWriteMethodField, self).bind(field_name, parent)
def to_internal_value(self, data):
value = self._field.to_internal_value(data)
method = getattr(self.parent, self.put_method_name, None)
if method:
value = method(value, self.field_type, self._field)
return {self.field_name: value}
def to_representation(self, value):
method = getattr(self.parent, self.get_method_name, None)
if method:
value = method(value, self.field_type, self._field)
return self._field.to_representation(value)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment