如何在Django Rest Framework中为相同的视图集创建不同的URL

时间:2017-01-12 10:29:38

标签: python django django-rest-framework

我的代码中有一个像这样的

class SampleSerializer(serializers.ModelSerializer):
      class Meta:
            model = Model

和像这样的Viewset

class SampleViewSet(GenericAPIView):
     serializer_class = SampleSerializer

     def get(self, request, *args, **kwargs):
         pass

     def post(self, request, *args, **kwargs):
         pass

     def put(self, request, *args, **kwargs):
         pass

我对此视图集有这样的网址

网址#1:

url(r'^sample/$', SampleViewSet.as_view())

这使我在我的视图集中拥有的所有方法的url,如get,post和put等。我想为我的get方法创建单独的url,但使用相同的序列化程序。此网址将如下所示

网址#2:

 url(r'^sample/(?P<model_id>\d+)/$', SampleViewSet.as_view())

如何使用相同的Viewset和Serializer执行此操作?当我在urls.py中编写Url#2时,Swagger向我展示了该Url方法的所有三种类型(get,post和put)。

2 个答案:

答案 0 :(得分:3)

您可以使用require_GET中的django.views.decorators.http装饰器,并在您的网址中使用它:

urlpatterns = [
    url(r'^sample/$', SampleViewSet.as_view()),
    url(r'^sample/(?P<model_id>\d+)/$', require_GET(SampleViewSet.as_view())),
]

对于更精细的调整,还有一个require_http_method装饰器,它在其参数中接收允许的方法,例如:

url(r'^sample/(?P<model_id>\d+)/$', require_http_method(['GET', 'DELETE'])(SampleViewSet.as_view()))

django docs: https://docs.djangoproject.com/en/1.10/topics/class-based-views/intro/#decorating-in-urlconf https://docs.djangoproject.com/en/1.10/topics/http/decorators/#django.views.decorators.http.require_GET

答案 1 :(得分:1)

为什么不从viewsets.ViewSet继承ViewSet并映射您的网址视图DefaultRouter

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'sample', SampleViewSet)
urlpatterns = router.urls

它将处理您的所有网址。 /sample/:id现在可用于GETPUTDELETE方法。
此外,如果您的Sample模型使用普通CRUD,则可以使用viewsets.ModelViewset更好的解决方案。