python - modelserializer - Deshabilitar un método en un ViewSet, django-rest-framework
modelserializer django rest framework (3)
ViewSets
tiene métodos automáticos para listar, recuperar, crear, actualizar, eliminar, ...
Me gustaría desactivar algunos de ellos, y la solución que se me ocurrió probablemente no sea buena, ya que OPTIONS
todavía los declara como permitidos.
¿Alguna idea sobre cómo hacer esto de la manera correcta?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
La definición de ModelViewSet
es:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet)
Entonces, en lugar de extender ModelViewSet
, ¿por qué no usar todo lo que necesita? Así por ejemplo:
from rest_framework import viewsets, mixins
class SampleViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
...
Con este enfoque, el enrutador solo debe generar rutas para los métodos incluidos.
Referencia :
Puedes seguir usando viewsets.ModelViewSet
y definir http_method_names
en tu ViewSet.
Ejemplo
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
http_method_names = [''get'', ''post'', ''head'']
Una vez que agregue http_method_names
, ya no podrá hacer put
y patch
.
Si quieres put
pero no quieres el patch
, puedes mantener http_method_names = [''get'', ''post'', ''head'', ''put'']
Internamente, las Vistas DRF se extienden desde Django CBV. Django CBV tiene un atributo llamado http_method_names. Entonces puede usar http_method_names con vistas DRF también.
Si está intentando deshabilitar el método PUT desde un viewset DRF, puede crear un enrutador personalizado:
from rest_framework.routers import DefaultRouter
class NoPutRouter(DefaultRouter):
"""
Router class that disables the PUT method.
"""
def get_method_map(self, viewset, method_map):
bound_methods = super().get_method_map(viewset, method_map)
if ''put'' in bound_methods.keys():
del bound_methods[''put'']
return bound_methods
Al deshabilitar el método en el enrutador, la documentación de su esquema de API será correcta.