mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-06-15 11:03:32 +03:00
Merge branch 'master' of git://github.com/sprymak/django-rest-framework into sprymak-master
This commit is contained in:
commit
8f6983ee6e
|
@ -21,6 +21,8 @@ from django.db import models
|
||||||
from django.forms import widgets
|
from django.forms import widgets
|
||||||
from django.utils.datastructures import SortedDict
|
from django.utils.datastructures import SortedDict
|
||||||
from rest_framework.compat import get_concrete_model, six
|
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:
|
# 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)
|
super(HyperlinkedModelSerializerOptions, self).__init__(meta)
|
||||||
self.view_name = getattr(meta, 'view_name', None)
|
self.view_name = getattr(meta, 'view_name', None)
|
||||||
self.lookup_field = getattr(meta, 'lookup_field', 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):
|
class HyperlinkedModelSerializer(ModelSerializer):
|
||||||
|
@ -1049,13 +1052,13 @@ class HyperlinkedModelSerializer(ModelSerializer):
|
||||||
if self.opts.view_name is None:
|
if self.opts.view_name is None:
|
||||||
self.opts.view_name = self._get_default_view_name(self.opts.model)
|
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(
|
url_field = self._hyperlink_identify_field_class(
|
||||||
view_name=self.opts.view_name,
|
view_name=self.opts.view_name,
|
||||||
lookup_field=self.opts.lookup_field
|
lookup_field=self.opts.lookup_field
|
||||||
)
|
)
|
||||||
ret = self._dict_class()
|
ret = self._dict_class()
|
||||||
ret['url'] = url_field
|
ret[self.opts.url_field_name] = url_field
|
||||||
ret.update(fields)
|
ret.update(fields)
|
||||||
fields = ret
|
fields = ret
|
||||||
|
|
||||||
|
@ -1091,7 +1094,7 @@ class HyperlinkedModelSerializer(ModelSerializer):
|
||||||
We need to override the default, to use the url as the identity.
|
We need to override the default, to use the url as the identity.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return data.get('url', None)
|
return data.get(self.opts.url_field_name, None)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,7 @@ DEFAULTS = {
|
||||||
'URL_FORMAT_OVERRIDE': 'format',
|
'URL_FORMAT_OVERRIDE': 'format',
|
||||||
|
|
||||||
'FORMAT_SUFFIX_KWARG': 'format',
|
'FORMAT_SUFFIX_KWARG': 'format',
|
||||||
|
'URL_FIELD_NAME': 'url',
|
||||||
|
|
||||||
# Input and output formats
|
# Input and output formats
|
||||||
'DATE_INPUT_FORMATS': (
|
'DATE_INPUT_FORMATS': (
|
||||||
|
|
|
@ -3,6 +3,7 @@ import json
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework import generics, status, serializers
|
from rest_framework import generics, status, serializers
|
||||||
from rest_framework.compat import patterns, url
|
from rest_framework.compat import patterns, url
|
||||||
|
from rest_framework.settings import api_settings
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import (
|
from rest_framework.tests.models import (
|
||||||
Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment,
|
Anchor, BasicModel, ManyToManyModel, BlogPost, BlogPostComment,
|
||||||
|
@ -331,3 +332,48 @@ class TestOverriddenURLField(TestCase):
|
||||||
serializer.data,
|
serializer.data,
|
||||||
{'title': 'New blog post', 'url': 'foo bar'}
|
{'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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user