Django rest framework Django REST框架APIView与Viewset
我目前正在使用Django rest framework Django REST框架APIView与Viewset,django-rest-framework,Django Rest Framework,我目前正在使用APIView作为url('/api/events/'),但我不能将同一个APIView用于列表视图,因为列表(全部获取)和详细信息(获取1)之间没有区别。此视图与模型无关,因为我正在调用ExternelAPI ViewSet在list和retrieve之间有区别,但是如果我使用它,我必须使用serializer\u类。但是,我在这个视图上没有序列化程序 我知道我可以创建第二个APIView,因此详细信息和列表视图都有1,但我发现这有点麻烦。把它放在一节课上比较干净 什么是最好的
APIView
作为url('/api/events/'
),但我不能将同一个APIView用于列表
视图,因为列表(全部获取)和详细信息(获取1)之间没有区别。此视图与模型无关,因为我正在调用ExternelAPI
ViewSet
在list和retrieve之间有区别,但是如果我使用它,我必须使用serializer\u类。但是,我在这个视图上没有序列化程序
我知道我可以创建第二个APIView,因此详细信息和列表视图都有1,但我发现这有点麻烦。把它放在一节课上比较干净
什么是最好的
示例:“
使用APIView
出于演示的目的,我仍然在retrieve/list
方法中使用queryset,但这不是强制性的,您应该在其中放置自己的逻辑
class TestAPIView(views.APIView):
def get(self, request, *args, **kwargs):
if 'pk' in kwargs:
return self.retrieve(request, *args, **kwargs)
else:
return self.list(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs):
instance = Test.objects.get(pk=kwargs['pk'])
serializer = TestSerializer(instance=instance)
return Response(serializer.data)
def list(self, request, *args, **kwargs):
queryset = Test.objects.all()
serializer = TestSerializer(queryset, many=True)
return Response(serializer.data)
然后在url.py
中添加以下行:
url(r'^test/$', TestAPIView.as_view(), name='test-list'),
url(r'^test/(?P<pk>[0-9]+)/$', TestAPIView.as_view(), name='test-detail'),
url(r'^test/$', TestViewSet.as_view({'get': 'list'}), name='test-list'),
url(r'^test/(?P<pk>[0-9]+)/$', TestViewSet.as_view({'get': 'retrieve'}), name='test-detail'),
使用ViewSet
您需要将请求方法的映射添加到URL定义中的函数中
from rest_framework import viewsets
class TestViewSet(viewsets.ViewSet):
def retrieve(self, request, *args, **kwargs):
instance = Test.objects.get(pk=kwargs['pk'])
serializer = TestSerializer(instance=instance)
return Response(serializer.data)
def list(self, request, *args, **kwargs):
queryset = Test.objects.all()
serializer = TestSerializer(queryset, many=True)
return Response(serializer.data)
然后在url.py
中添加以下行:
url(r'^test/$', TestAPIView.as_view(), name='test-list'),
url(r'^test/(?P<pk>[0-9]+)/$', TestAPIView.as_view(), name='test-detail'),
url(r'^test/$', TestViewSet.as_view({'get': 'list'}), name='test-list'),
url(r'^test/(?P<pk>[0-9]+)/$', TestViewSet.as_view({'get': 'retrieve'}), name='test-detail'),
请添加您的api视图,您真正想要实现的是什么?嗨,Gabriel,好的,我添加了一个示例。我有一个get和一个get_detail方法。在my urls.py中,我必须添加一个带有/test的条目,1个带有/test,1个带有/test/1,我想对这两个条目使用此APIView。从您的示例看,您有一个querysettest.objects.all()
而且它是序列化程序,那么为什么不使用视图集呢?
如果在视图集中需要,您可以为列表/详细信息使用不同的序列化程序类,只需子类获取序列化程序类
方法并检查self.action
很抱歉,您是对的,但我没有查询集,我正在另一个API周围实现一个层n您应该坚持使用正常的APIView
,有一个视图类,它检查get
方法kwargs发送请求。然后有两个不同的URL,一个用于列表,另一个用于详细信息(使用该kwargs),并将它们指向同一个视图。我问了另一个问题。我是否也可以无礼地问您这个问题?
path('test/', TestViewSet.as_view({'get': 'list'}), name='test-list'),
path('test/<int:pk>/', TestViewSet.as_view({'get': 'retrieve'}), name='test-detail),