我正在阅读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时将使用的名称。默认情况下,这将仅仅是您的model
或queryset
,尽管如果您使用ViewSet
的get_queryset
方法,您可能需要自动设置它。
如果你不实现你自己的url名,那么base_name
将被用来为你实现它们。例如,假定您的Model
是MyUser
,那么您的命名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中使用这个包来实现集合级别控制器的讨论可以在这里找到。