如何在 Django Rest Framework 中为相同的视图设置不同的 URL

Muh*_*san 2 python django django-rest-framework

我的代码中有一个像这样的序列化程序

class SampleSerializer(serializers.ModelSerializer):
      class Meta:
            model = Model
Run Code Online (Sandbox Code Playgroud)

和这样的视图集

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
Run Code Online (Sandbox Code Playgroud)

我有这个视图集的网址

网址 #1:

url(r'^sample/$', SampleViewSet.as_view())
Run Code Online (Sandbox Code Playgroud)

这为我在视图集中拥有的所有方法(如 get、post 和 put 等)制作了 url。我想为我的 get 方法制作单独的 url,但使用相同的序列化程序。这个网址看起来像这样

网址 #2:

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

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

Ant*_*ash 5

您可以为此使用require_GET装饰器django.views.decorators.http,并在您的 URL 配置中使用它:

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

为了进行更精细的调整,还有一个require_http_method装饰器可以在其参数中接收允许的方法,例如:

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

有关详细信息,请参阅https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-in-urlconf