坚持创建Django REST框架ViewSet

时间:2015-09-13 19:34:15

标签: python django django-rest-framework

我不知道如何创建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文件中,我想创建一个UserViewSet类来处理url调用的所有可能变体。

首先,如果我应该使用,我无法解决:

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):

但我无法弄清楚如何满足网址中<user-id>的其他变体。

有推荐的方法吗?

某些API调用有一个尾随'/'而有些则没有。这是我给予的(适合现有的移动应用程序)。

编辑:顺便说一句,我现在已经完成了两次DRF教程,但仍然无法看到如何执行此操作。

EDIT2:我真的很难理解DRF文档。任何人都可以提供一些处理我的用例的示例代码吗?

2 个答案:

答案 0 :(得分:1)

使用ViewSetView取决于您的用户资源所需的其他操作,而不是您网址中的操作。 ModelViewSet由mixins构建,用于列表,更新等。您可以将这些组合起来以实现您想要的效果,也可以将视图组合起来。

当然,如果必须,可以将视图集与视图结合使用。

对于/api/v1/user/<user_id>/friends/端点,您可以查看DRF docsDRF Nested Routers

可以使用仅返回该单个值的视图来实现like_count

Auth完全是另一个主题 - 你可以看看this

答案 1 :(得分: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中将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