diff options
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/serializers.py | 9 | ||||
| -rw-r--r-- | rest_framework/settings.py | 1 | ||||
| -rw-r--r-- | rest_framework/tests/test_hyperlinkedserializers.py | 46 | 
3 files changed, 53 insertions, 3 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 9f047b03..414a769f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -21,6 +21,8 @@ from django.db import models  from django.forms import widgets  from django.utils.datastructures import SortedDict  from rest_framework.compat import get_concrete_model, six +from rest_framework.settings import api_settings +  # Note: We do the following so that users of the framework can use this style:  # @@ -1031,6 +1033,7 @@ class HyperlinkedModelSerializerOptions(ModelSerializerOptions):          super(HyperlinkedModelSerializerOptions, self).__init__(meta)          self.view_name = getattr(meta, 'view_name', None)          self.lookup_field = getattr(meta, 'lookup_field', None) +        self.url_field_name = getattr(meta, 'url_field_name', api_settings.URL_FIELD_NAME)  class HyperlinkedModelSerializer(ModelSerializer): @@ -1049,13 +1052,13 @@ class HyperlinkedModelSerializer(ModelSerializer):          if self.opts.view_name is None:              self.opts.view_name = self._get_default_view_name(self.opts.model) -        if 'url' not in fields: +        if self.opts.url_field_name not in fields:              url_field = self._hyperlink_identify_field_class(                  view_name=self.opts.view_name,                  lookup_field=self.opts.lookup_field              )              ret = self._dict_class() -            ret['url'] = url_field +            ret[self.opts.url_field_name] = url_field              ret.update(fields)              fields = ret @@ -1091,7 +1094,7 @@ class HyperlinkedModelSerializer(ModelSerializer):          We need to override the default, to use the url as the identity.          """          try: -            return data.get('url', None) +            return data.get(self.opts.url_field_name, None)          except AttributeError:              return None diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 8abaf140..ce171d6d 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -95,6 +95,7 @@ DEFAULTS = {      'URL_FORMAT_OVERRIDE': 'format',      'FORMAT_SUFFIX_KWARG': 'format', +    'URL_FIELD_NAME': 'url',      # Input and output formats      'DATE_INPUT_FORMATS': ( diff --git a/rest_framework/tests/test_hyperlinkedserializers.py b/rest_framework/tests/test_hyperlinkedserializers.py index 61e613d7..83d46043 100644 --- a/rest_framework/tests/test_hyperlinkedserializers.py +++ b/rest_framework/tests/test_hyperlinkedserializers.py @@ -3,6 +3,7 @@ import json  from django.test import TestCase  from rest_framework import generics, status, serializers  from rest_framework.compat import patterns, url +from rest_framework.settings import api_settings  from rest_framework.test import APIRequestFactory  from rest_framework.tests.models import (      Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment, @@ -331,3 +332,48 @@ class TestOverriddenURLField(TestCase):              serializer.data,              {'title': 'New blog post', 'url': 'foo bar'}          ) + + +class TestURLFieldNameBySettings(TestCase): +    urls = 'rest_framework.tests.test_hyperlinkedserializers' + +    def setUp(self): +        self.saved_url_field_name = api_settings.URL_FIELD_NAME +        api_settings.URL_FIELD_NAME = 'global_url_field' + +        class Serializer(serializers.HyperlinkedModelSerializer): + +            class Meta: +                model = BlogPost +                fields = ('title', api_settings.URL_FIELD_NAME) + +        self.Serializer = Serializer +        self.obj = BlogPost.objects.create(title="New blog post") + +    def tearDown(self): +        api_settings.URL_FIELD_NAME = self.saved_url_field_name + +    def test_overridden_url_field_name(self): +        request = factory.get('/posts/') +        serializer = self.Serializer(self.obj, context={'request': request}) +        self.assertIn(api_settings.URL_FIELD_NAME, serializer.data) + + +class TestURLFieldNameByOptions(TestCase): +    urls = 'rest_framework.tests.test_hyperlinkedserializers' + +    def setUp(self): +        class Serializer(serializers.HyperlinkedModelSerializer): + +            class Meta: +                model = BlogPost +                fields = ('title', 'serializer_url_field') +                url_field_name = 'serializer_url_field' + +        self.Serializer = Serializer +        self.obj = BlogPost.objects.create(title="New blog post") + +    def test_overridden_url_field_name(self): +        request = factory.get('/posts/') +        serializer = self.Serializer(self.obj, context={'request': request}) +        self.assertIn(self.Serializer.Meta.url_field_name, serializer.data)  | 
