ViewSets
dispose de méthodes automatiques pour lister, récupérer, créer, mettre à jour, supprimer, ...
J'aimerais en désactiver certaines, et la solution que j'ai proposée n'est probablement pas une bonne solution, car OPTIONS
indique toujours qu'elles sont autorisées.
Une idée sur la façon de faire cela de la bonne façon?
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 définition de ModelViewSet
est:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet)
Donc plutôt que d’allonger ModelViewSet
, pourquoi ne pas utiliser ce dont vous avez besoin? Donc par exemple:
from rest_framework import viewsets, mixins
class SampleViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
...
Avec cette approche, le routeur ne doit générer que des itinéraires pour les méthodes incluses.
Référence :
Vous pouvez continuer à utiliser viewsets.ModelViewSet
et définir http_method_names
sur votre ViewSet.
Exemple
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
http_method_names = ['get', 'post', 'head']
Une fois que vous ajoutez http_method_names
, vous ne pourrez plus faire put
et patch
.
Si vous voulez put
mais que vous ne voulez pas patch
, vous pouvez conserver http_method_names = ['get', 'post', 'head', 'put']
En interne, les vues DRF s’étendent de Django CBV. Django CBV a un attribut appelé http_method_names. Vous pouvez donc aussi utiliser http_method_names avec des vues DRF.
[Prise sans vergogne]: Si cette réponse vous a aidé, vous aimerez ma série de publications sur DRF à l'adresse https://www.agiliq.com/blog/2019/04/drf-polls/ .
Si vous essayez de désactiver la méthode PUT à partir d'un groupe de vues DRF, vous pouvez créer un routeur personnalisé:
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
En désactivant la méthode sur le routeur, la documentation de votre schéma d’API sera correcte.
Comment désactiver la méthode "DELETE" pour ViewSet dans DRF
class YourViewSet(viewsets.ModelViewSet):
http_method_names = [m for m in super().http_method_names if m != 'delete']
P.S. C’est plus fiable que de spécifier explicitement toutes les méthodes nécessaires, il ya donc moins de chance d’oublier certaines des méthodes importantes OPTIONS, HEAD, etc.
P.P.S. Par défaut, DRF a http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']