2015-09-13 69 views
2

我試圖解決如何創建一個Django REST框架ViewSet。創建一個Django REST框架ViewSet

我繼承了這個樣子的API調用:

/api/v1/user/<user_id>/like_count 
/api/v1/user/<user_id>/friends/ 
/api/v1/user/login 
/api/v1/user/logout/ 

在我的基地urls.py我有以下幾點:

urlpatterns = patterns('', 
    url(r'^api/v1/', include('api.urls')), 
    url(r'^$', TemplateView.as_view(template_name='base.html'), name='home'), 
    url(r'^docs/', include('rest_framework_swagger.urls')) 
) 

我有調用的API的應用程序。在API urls.py我:

from django.conf.urls import url, include 
from rest_framework import routers 
from api import views 

router = routers.DefaultRouter() 
router.register(r'user', views.UserViewSet) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 
] 

在我的API/views.py文件我想創建一個處理URL調用的所有可能的變體UserViewSet類。

首先,我不能工作了,如果我要使用:

class UserViewSet(viewsets.ModelViewSet): 

或...

class UserViewSet(APIView): 

如果我理解正確的話,我可以應付

/api/v1/user/login 
/api/v1/user/logout 

使用類似的電話:

class UserViewSet(viewsets.APIView): 
    def login(self, request, format=None): 
     ... 
    def logout(self,request, format=None): 

但我不能解決如何滿足在URL中有<user-id>的其他變體。

有沒有推薦的方法來做到這一點?

一些API調用有一個尾隨的'/',有些則沒有。這正是我得到的(以適應現有的移動應用程序)。

編輯:順便說一句,我已經做了兩次DRF教程,現在仍然無法看到如何做到這一點。

EDIT2:我非常努力地理解DRF文檔。任何人都可以提供一些示例代碼來處理我的用例嗎?

+0

按照第DRF的網站上[教程](http://www.django-rest-framework.org/tutorial/quickstart/)。沒有開玩笑。 – Pynchia

+0

是的!我已經完成了兩次教程,但我仍然沒有看到如何做到這一點。因此,這個問題在Stackoverflow。 –

+0

在您實現自定義URL和內容之前,因爲沒有人意識到DRF可以自動執行此操作,請查看允許自定義路由和視圖的視圖集的修飾器的文檔。你正在尋找兩條細節路線和兩條列表路線。 –

回答

1

使用ViewSetView旨意取決於你所需要的其他行動的除了那些您的網址有你的用戶資源。 ModelViewSet是從mixins構建的,用於列表,更新等。您可以結合這些來實現您想要的內容,或者您​​可以結合使用視圖。

當然,如果必須的話,您可以將視圖與視圖組合在一起。

對於/api/v1/user/<user_id>/friends/端點,你可以看看DRF docsDRF Nested Routers

like_count可以實現一個只返回單一值的視圖。

認證是完全不同的話題---你可以看看this

+0

我已經多次閱讀文檔,但無法看到如何創建處理所列出的所有api調用的視圖集。因此我在這裏問的原因。 –

+0

你真的必須用_single_ viewset實現整個事物嗎? – Ivan

+0

我很樂於提供建議,但想了解如何儘可能使用單個視圖 –

0

viewsets。PY

class UserViewset(viewsets.ModelViewSet): 
    lookup_field = 'id' 
    serializer_class = UserSerializer 
    queryset = User.objects.all() 

urls.py
from .viewsets import UserViewSet 
user_list = UserViewSet.as_view({'get':'list'}) 
user_detail = UserViewSet.as_view({'get':'retrieve'}) 

urlpatterns= [ 
    url(r'^user/(?P<id>\d+)/(?P<friends>[-\w\d]+)/$', user_detail, name='user-detail') 

] 

在serializers.py ADDE的ParameterisedHyperlinkedIdentityField作爲串行器。

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    url = ParameterisedHyperlinkedIdentityField(view_name='user-detail', lookup_fields=(('id', 'id'), ('friends', 'friends')), read_only=True) 

    class Meta: 
     model = User 
+0

這聽起來像是他們已經設置了視圖,他們只是試圖將它們遷移到視圖集。所以我不知道如何推薦一個完全不同的身份驗證系統在這裏幫助。 –

+0

我沒有問題,認證的東西 –

+0

@BillNoble改變了代碼現在試試 –

相關問題