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 OPTIONS
todaví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_update
mé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.ModelViewSet
y definirhttp_method_names
en su ViewSet.Ejemplo
Una vez que agregue
http_method_names
, no podrá hacerput
ypatch
más.Si quieres
put
pero 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
python3
yDjango 1.10
está bien.mixins.UpdateModelMixin
Aunque 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
super
a 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_view
mé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 deseaSample
que se cree o lea el modelo, pero no desea que se modifique. Entonces significa que quiereslist
,retrieve
ycreate
método sea habilitar (y desea a otros a ser desactivada.)Todo lo que necesita hacer es agregar rutas
urlpatterns
como estas:Como puede ver, no hay una solicitud
delete
yput
en la configuración de enrutamiento anterior, por ejemplo, si envía unaput
solicitud a la URL, le responde con 405Method Not Allowed
:fuente
Si planea deshabilitar los métodos put / post / destroy, puede usar
fuente