我不知道如何创建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文档。任何人都可以提供一些处理我的用例的示例代码吗?
答案 0 :(得分:1)
使用ViewSet
或View
取决于您的用户资源所需的其他操作,而不是您网址中的操作。 ModelViewSet
由mixins构建,用于列表,更新等。您可以将这些组合起来以实现您想要的效果,也可以将视图组合起来。
当然,如果必须,可以将视图集与视图结合使用。
对于/api/v1/user/<user_id>/friends/
端点,您可以查看DRF docs或DRF Nested Routers。
可以使用仅返回该单个值的视图来实现like_count
。
Auth完全是另一个主题 - 你可以看看this。
答案 1 :(得分:0)
class UserViewset(viewsets.ModelViewSet):
lookup_field = 'id'
serializer_class = UserSerializer
queryset = User.objects.all()
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添加为序列化程序。
class UserSerializer(serializers.HyperlinkedModelSerializer):
url = ParameterisedHyperlinkedIdentityField(view_name='user-detail', lookup_fields=(('id', 'id'), ('friends', 'friends')), read_only=True)
class Meta:
model = User