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。从您的示例看,您有一个queryset
test.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),