aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rest_framework/authtoken/migrations/0001_initial.py7
-rw-r--r--rest_framework/routers.py12
-rw-r--r--tests/test_routers.py18
3 files changed, 31 insertions, 6 deletions
diff --git a/rest_framework/authtoken/migrations/0001_initial.py b/rest_framework/authtoken/migrations/0001_initial.py
index 2e5d6b47..769f6202 100644
--- a/rest_framework/authtoken/migrations/0001_initial.py
+++ b/rest_framework/authtoken/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# encoding: utf8
+# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
@@ -15,12 +15,11 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Token',
fields=[
- ('key', models.CharField(max_length=40, serialize=False, primary_key=True)),
- ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, to_field='id')),
+ ('key', models.CharField(primary_key=True, serialize=False, max_length=40)),
('created', models.DateTimeField(auto_now_add=True)),
+ ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, related_name='auth_token')),
],
options={
- 'abstract': False,
},
bases=(models.Model,),
),
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
index 8f1ab6fa..f2d06211 100644
--- a/rest_framework/routers.py
+++ b/rest_framework/routers.py
@@ -19,6 +19,7 @@ import itertools
from collections import namedtuple
from django.conf.urls import patterns, url
from django.core.exceptions import ImproperlyConfigured
+from django.core.urlresolvers import NoReverseMatch
from rest_framework import views
from rest_framework.response import Response
from rest_framework.reverse import reverse
@@ -287,7 +288,16 @@ class DefaultRouter(SimpleRouter):
def get(self, request, *args, **kwargs):
ret = {}
for key, url_name in api_root_dict.items():
- ret[key] = reverse(url_name, request=request, format=kwargs.get('format', None))
+ try:
+ ret[key] = reverse(
+ url_name,
+ request=request,
+ format=kwargs.get('format', None)
+ )
+ except NoReverseMatch:
+ # Don't bail out if eg. no list routes exist, only detail routes.
+ continue
+
return Response(ret)
return APIRoot.as_view()
diff --git a/tests/test_routers.py b/tests/test_routers.py
index b076f134..f6f5a977 100644
--- a/tests/test_routers.py
+++ b/tests/test_routers.py
@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url, include
from django.db import models
from django.test import TestCase
from django.core.exceptions import ImproperlyConfigured
-from rest_framework import serializers, viewsets, permissions
+from rest_framework import serializers, viewsets, mixins, permissions
from rest_framework.decorators import detail_route, list_route
from rest_framework.response import Response
from rest_framework.routers import SimpleRouter, DefaultRouter
@@ -284,3 +284,19 @@ class TestDynamicListAndDetailRouter(TestCase):
else:
method_map = 'get'
self.assertEqual(route.mapping[method_map], endpoint)
+
+
+class TestRootWithAListlessViewset(TestCase):
+ def setUp(self):
+ class NoteViewSet(mixins.RetrieveModelMixin,
+ viewsets.GenericViewSet):
+ model = RouterTestModel
+
+ self.router = DefaultRouter()
+ self.router.register(r'notes', NoteViewSet)
+ self.view = self.router.urls[0].callback
+
+ def test_api_root(self):
+ request = factory.get('/')
+ response = self.view(request)
+ self.assertEqual(response.data, {})