Created
November 25, 2015 07:32
-
-
Save sergeybe/489d3847aa7185f5b8b6 to your computer and use it in GitHub Desktop.
Read and write field wrapper for Django REST Framework
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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