tutorial modelserializer list_route framework drf decorators create python django django-views django-rest-framework

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 :

ModelViewSet


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.