diff --git a/rest_framework_dyn_serializer.py b/rest_framework_dyn_serializer.py index 9b984bb..6ae2816 100644 --- a/rest_framework_dyn_serializer.py +++ b/rest_framework_dyn_serializer.py @@ -1,3 +1,5 @@ +from django.core.exceptions import ObjectDoesNotExist + from rest_framework import serializers @@ -10,6 +12,7 @@ def __init__(self, *args, **kwargs): self._requested_fields = [] limit_fields = kwargs.pop('limit_fields', False) + self.nested = kwargs.pop('nested', False) s_type = type(self) assert hasattr(self.Meta, 'model'), '{} Meta.model param is required'.format(s_type) @@ -50,6 +53,24 @@ def __init__(self, *args, **kwargs): else: self.request_all_allowed_fields() + def get_value(self, data): + if not self.nested or self.field_name not in data: + return super().get_value(data) + return data[self.field_name] + + def to_internal_value(self, data): + ''' + Allow pass value of nested field, assume that passed value is PK + ''' + if not self.nested: + return super().to_internal_value(data) + try: + return self.Meta.model.objects.get(pk=data) + except ObjectDoesNotExist: + self.fail('does_not_exist', pk_value=data) + except (TypeError, ValueError): + self.fail('incorrect_type', data_type=type(data).__name__) + def request_all_allowed_fields(self): for field in self._allowed_fields: self._requested_fields.append(field) diff --git a/setup.py b/setup.py index b878303..1cdb3b9 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ license="MIT", platforms=['Platform Independent'], url="https://github.com/Nepherhotep/django-rest-framework-dyn-serializer", - install_requires=['django==1.9', 'djangorestframework>=3.3.0'], + install_requires=['django>=1.9', 'djangorestframework>=3.3.0'], classifiers=["Framework :: Django :: 1.9", "Development Status :: 5 - Production/Stable", "Programming Language :: Python :: 2.7",