我正在阅读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
和这个urls.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?
}
答案 0 :(得分:5)
这里有两个不同的问题,所以我将分别对它们进行解决。
首先,base_name
只是ViewSet
在生成指定网址时将使用的名称。默认情况下,这只是您的model
或queryset
,但如果您使用ViewSet
的{{1}}方法,则可能需要自动设置get_queryset
如果您没有实现自己的网址名称,则base_name
将用于为您实施这些网址。例如,假设您的Model
为MyUser
,则您的指定网址将类似于'myuser-list'
或'myuser-detail'
。
如果感兴趣,文档为here。
您正在使用DefaultRouter
,这样您就可以访问http://127.0.0.1:8000/api/v1/
处的API根视图,如您所示。此根视图仅显示列表视图。使用@action
创建详细信息视图。在您的情况下,您可以在customaction
找到^utente/{pk}/customaction/$
视图。 它不会显示在API根目录中,因为它不是列表视图。
可以找到关于@action
和自定义方法的一般信息here。
此外,如果出于某种原因, 想要customaction
列表级视图,则需要进行一些修改。您可以自己为自定义路由排序,而不使用@action
装饰器(专门用于详细视图)。可以找到一个例子here。
您的另一个选择是使用new-ish drf-extensions包。可以在here找到使用该包在ViewSets中实现集合级控制器的讨论。