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)方法。
您可以为此使用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。