我不能让@detail_route像我想的那样工作。
我有两个API调用要处理:
/movie/
/movie/highlight
我正在尝试使用@detail_route在视图集中拾取/movie/突出显示url。
我的urls.py看起来是这样的:
from django.conf.urls import url, include
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'users', views.UsersViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'movie', views.MovieViewSet)
我的views.py看起来是这样的:
rom django.contrib.auth.models import User, Group
from movies.models import Movie
from api.serializers import UserSerializer, GroupSerializer, MovieSerializer
from rest_framework.response import Response
from rest_framework import permissions
from rest_framework import renderers
from rest_framework import viewsets
from rest_framework.decorators import detail_route
# Code from DRF quickstart tutorial
class UsersViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
# Code from DRF quickstart tutorial
class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
# MY CODE
class MovieViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Movie.objects.all().order_by('-title')
serializer_class = MovieSerializer
@detail_route(renderer_classes=(renderers.StaticHTMLRenderer,))
def highlight(self, request, *args, **kwargs):
snippet = "Highlight"
return Response(snippet)
serializers.py看起来如下所示:
from django.contrib.auth.models import User, Group
from movies.models import *
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name')
# My code...
class MovieSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Movie
fields = ('title', 'details')
如果我尝试/育婴/ url调用,它就会像预期的那样工作。如果我尝试/育人/高亮/调用,我会得到一个404错误。
我是DRF的新手,所以怀疑我正在做一些非常愚蠢的事情,但无法从我扫描过的各种文档和教程中找到什么。
发布于 2015-09-14 07:44:49
您需要使用@list_route
@detail_route
装饰器而不是@detail_route
装饰器。
这将生成url movie/highlight/
。
使用@list_route
修饰方法生成{prefix}/{methodname}/
类型的url,而detail_route
修饰方法生成{prefix}/{lookup}/{methodname}/
类型的url。这里,methodname
是方法的名称,lookup
是执行查找的查找值,用于获取对象的详细视图。
class MovieViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Movie.objects.all().order_by('-title')
serializer_class = MovieSerializer
# use list_route decorator
@list_route(renderer_classes=(renderers.StaticHTMLRenderer,))
def highlight(self, request, *args, **kwargs):
snippet = "Highlight"
return Response(snippet)
发布于 2015-09-14 07:44:32
如果您使用routers.DefaultRouter(),注册您的URL,它将生成URL /movie/pk/highlight而不是/movie/highlight.如果您想要自定义URL而不是预先生成的URL,请使用URL映射。
https://stackoverflow.com/questions/32568484
复制