diff --git a/dynamic_rest/fields/fields.py b/dynamic_rest/fields/fields.py index 2ebb3808..c0020ff0 100644 --- a/dynamic_rest/fields/fields.py +++ b/dynamic_rest/fields/fields.py @@ -268,20 +268,7 @@ def _is_dynamic(self): ) def get_attribute(self, instance): - serializer = self.serializer - model = serializer.get_model() - - # attempt to optimize by reading the related ID directly - # from the current instance rather than from the related object - if not self.kwargs['many'] and serializer.id_only(): - return instance - elif model is not None: - try: - return getattr(instance, self.source) - except model.DoesNotExist: - return None - else: - return instance + return instance def to_representation(self, instance): """Represent the relationship, either as an ID or object.""" @@ -296,18 +283,18 @@ def to_representation(self, instance): # try the faster way first: if hasattr(instance, source_id): return getattr(instance, source_id) - elif model is not None: - # this is probably a one-to-one field, or a reverse related - # lookup, so let's look it up the slow way and let the - # serializer handle the id dereferencing - try: - instance = getattr(instance, source) - except model.DoesNotExist: - instance = None # dereference ephemeral objects if model is None: instance = getattr(instance, source) + else: + # this is probably a one-to-one field, or a reverse related + # lookup, so let's look it up the slow way and let the + # serializer handle the id dereferencing + try: + instance = getattr(instance, source) + except model.DoesNotExist: + instance = None if instance is None: return None diff --git a/tests/test_serializers.py b/tests/test_serializers.py index 057d4d36..d4e307f5 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -1,5 +1,5 @@ import unittest -from mock import patch +from mock import patch, Mock from collections import OrderedDict from django.test import TestCase, override_settings @@ -523,6 +523,31 @@ def test_post_processor(data): data = serializer.data self.assertTrue(data.get('post_processed')) + def test_to_representation_passed_model_instance(self): + mock_obj = Mock() + + class GroupRelationField(DynamicRelationField): + def to_representation(self, instance): + mock_obj(instance) + # Dead men have no groups + if instance.is_dead: + return [] + return super(GroupRelationField, self).to_representation( + instance) + + class UserCustomGroupFieldSerializer(UserSerializer): + groups = GroupRelationField(GroupSerializer, many=True, embed=True) + + user = User.objects.create(name='Dead', last_name='Mort', is_dead=True) + user.groups.add(*self.fixture.groups) + + data = UserCustomGroupFieldSerializer( + user, request_fields={'groups': {'name': True}} + ).data + + assert data['groups'] == [] + mock_obj.assert_called_once_with(user) + class TestListSerializer(TestCase):