web-dev-qa-db-fra.com

Désactiver une méthode dans un ViewSet, Django-rest-framework

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)
94
db0

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 :

ModelViewSet

201
SunnySydeUp

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/ .

98
Akshar Raaj

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.

4
storn

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']

1
pymen