我的代码中有一个像这样的
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)。
答案 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
现在可用于GET
,PUT
和DELETE
方法。
此外,如果您的Sample
模型使用普通CRUD,则可以使用viewsets.ModelViewset
更好的解决方案。