django-rest defaultRouter 不添加@action



我正在阅读http://www.django-rest-framework.org/api-guide/routers#usage,无法理解base_name是什么。我也试着添加一个自定义动作,但路由器不会接收它

我有这个views.py

@authentication_classes((SessionAuthentication, TokenAuthentication))
@permission_classes((IsAuthenticated,))  
class utente(CreateModelMixin, RetrieveAPIView, GenericViewSet, ViewSet):
    model = MyUser
    serializer_class = MyUserSerializer
    def retrieve(self, request, *args, **kwargs):
        self.object = MyUser.objects.get(
           pk = request.user.pk
        )
        serializer = MyUserSerializerGET(self.object)
        return Response(serializer.data)
    @action(permission_classes=[IsAuthenticated])#POST action    
    def customaction(self, request):
        return Response( None )
        pass

和url .py

admin.autodiscover()

router_v1 = routers.DefaultRouter(trailing_slash=True)
router_v1.register(r'register', my_register, 'wtf' )
router_v1.register(r'utente', utente, 'wtf2' )
#router_v1.register(r'utente/customaction', utente.as_view({'post' : 'customaction'})   )
api_urls_v1 = router_v1.urls
api_urls = patterns('',
    url(r'^v1/', include(api_urls_v1)),
)  
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'wecup.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/', 'rest_framework.authtoken.views.obtain_auth_token'), 
    url(r'^logout/', my_logout ), 
    url(r'^api/', include(api_urls)), 
)

打开http://127.0.0.1:8000/api/v1/

HTTP 200 OK Content-Type: application/json Vary: Accept Allow: GET, HEAD, OPTIONS
{
    "register": "http://127.0.0.1:8000/api/v1/register/", 
    "utente": "http://127.0.0.1:8000/api/v1/utente/"

     where is customaction?
}

这里有两个不同的问题,所以我将分别解决它们。

基本名称

首先,base_name只是ViewSet在生成命名url时将使用的名称。默认情况下,这将仅仅是您的modelqueryset,尽管如果您使用ViewSetget_queryset方法,您可能需要自动设置它。

如果你不实现你自己的url名,那么base_name将被用来为你实现它们。例如,假定您的ModelMyUser,那么您的命名url将类似于'myuser-list''myuser-detail'

文档,如果感兴趣,在这里。

@action和自定义方法

您正在使用DefaultRouter,它允许您访问http://127.0.0.1:8000/api/v1/的API根视图,如您所示。这个根视图只显示列表视图。使用@action创建一个详细视图。在您的情况下,您的customaction视图可以在^utente/{pk}/customaction/$中找到。它不会出现在API根目录中,因为它不是列表视图。

关于@action和自定义方法的一般信息可以在这里找到。

同样,如果出于某种原因,您确实想使customaction成为列表级视图,则需要进行一些修改。您可以自己串起一个自定义路由,而不使用@action装饰器(这是专门用于详细视图的)。在这里可以找到一个例子。

你的另一个选择是使用新的drf-extensions包。关于在ViewSets中使用这个包来实现集合级别控制器的讨论可以在这里找到。

最新更新