ViewSets tienen métodos automáticos para listar, recuperar, crear, actualizar, eliminar, ...
Me gustaría deshabilitar algunos de ellos, y la solución que se me ocurrió probablemente no sea buena, ya que OPTIONStodavía los indica como permitidos.
¿Alguna idea de 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)

UpdateModelMixin. Si desea utilizar la actualización pero no el parche, actualmente puedo pensar en dos formas. Puede anular los métodos permitidos en la vista y eliminar "parche" o puede anular elpartial_updatemétodo y llamarhttp_method_not_allowed(request, *args, **kwargs). No lo he probado, así que no estoy seguro de si funcionaclass SampleViewSet(viewsets.ReadOnlyModelViewSet).Puede seguir usando
viewsets.ModelViewSety definirhttp_method_namesen su ViewSet.Ejemplo
Una vez que agregue
http_method_names, no podrá hacerputypatchmás.Si quieres
putpero no quierespatch, puedes quedartehttp_method_names = ['get', 'post', 'head', 'put']Internamente, las vistas DRF se extienden desde Django CBV. Django CBV tiene un atributo llamado http_method_names. Por lo tanto, también puede usar http_method_names con vistas DRF.
[Shameless Plug]: Si esta respuesta fue útil, le gustará mi serie de publicaciones sobre DRF en https://www.agiliq.com/blog/2019/04/drf-polls/ .
fuente
python3yDjango 1.10está bien.mixins.UpdateModelMixinAunque ha pasado un tiempo para esta publicación, de repente descubrí que en realidad hay una forma de deshabilitar esa función, puede editarla directamente en views.py.
Fuente: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
fuente
Si está intentando deshabilitar el método PUT desde un conjunto de vistas DRF, puede crear un enrutador personalizado:
Al deshabilitar el método en el enrutador, la documentación de su esquema de api será correcta.
fuente
Cómo deshabilitar el método "DELETE" para ViewSet en DRF
PD: Esto es más confiable que especificar explícitamente todos los métodos necesarios, por lo que hay menos posibilidades de olvidar algunos de los métodos importantes OPTIONS, HEAD, etc.
PPS por defecto DRF tiene
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']fuente
supera nivel de clase, no hayself.En Django Rest Framework 3.xx, simplemente puede habilitar cada método para el que desea habilitar
ModelViewSet, pasando un diccionario aas_viewmétodo. En este diccionario, la clave debe contener el tipo de solicitud (GET, POST, DELETE, etc.) y el valor debe contener el nombre del método correspondiente (listar, recuperar, actualizar, etc.). Por ejemplo, digamos que deseaSampleque se cree o lea el modelo, pero no desea que se modifique. Entonces significa que quiereslist,retrieveycreatemétodo sea habilitar (y desea a otros a ser desactivada.)Todo lo que necesita hacer es agregar rutas
urlpatternscomo estas:Como puede ver, no hay una solicitud
deleteyputen la configuración de enrutamiento anterior, por ejemplo, si envía unaputsolicitud a la URL, le responde con 405Method Not Allowed:fuente
Si planea deshabilitar los métodos put / post / destroy, puede usar
fuente