Désactiver une méthode dans un ViewSet, django-repos-cadre
ViewSets
ont des méthodes automatiques de liste, récupérer, créer, mettre à jour, supprimer, ...
Je voudrais désactiver certains de ceux-ci, et la solution que j'ai trouvé est probablement pas bon, car OPTIONS
encore membres de ces permis.
Aucune idée sur la manière de procéder 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)
Vous devez vous connecter pour publier un commentaire.
La définition de
ModelViewSet
est:Donc, plutôt que de l'étendre
ModelViewSet
, pourquoi ne pas simplement utiliser ce que vous avez besoin? Ainsi, par exemple:Avec cette approche, le routeur ne devrait générer des itinéraires pour les méthodes.
Référence:
ModelViewSet
reverse
? Comment avez-vous mis en place votre viewset?UpdateModelMixin
. Si vous souhaitez utiliser la mise à jour mais pas le patch, je peux pensons actuellement de deux façons. Vous pouvez remplacer les méthodes autorisées dans la vue et de supprimer les "patch" ou vous pouvez remplacer lapartial_update
méthode et appelhttp_method_not_allowed(request, *args, **kwargs)
. Je n'ai pas testé donc je ne sais pas si il fonctionneself.create
pour une requête POST) et puis il soulève une AttributeError. La réponse appropriée serait d'élever une 405.class SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Vous pouvez garder à l'aide de
viewsets.ModelViewSet
et de définirhttp_method_names
sur votre ViewSet.Exemple
Une fois que vous ajoutez
http_method_names
, vous ne serez pas en mesure de le faireput
etpatch
plus.Si vous voulez
put
, mais ne veulent paspatch
, vous pouvez garderhttp_method_names = ['get', 'post', 'head', 'put']
En interne, la FONDATION la Vue s'étend à partir de Django CBV. Django CBV a un attribut appelé http_method_names. Ainsi, vous pouvez utiliser http_method_names avec DRF vues trop.
[Shameless Plug]: Si cette réponse vous a été utile, vous aimerez ma série de posts sur DRF à https://www.agiliq.com/blog/2019/04/drf-polls/.
python3
etDjango 1.10
l'amende juste.mixins.UpdateModelMixin
Si vous essayez de désactiver la méthode PUT partir d'une DRF viewset, vous pouvez créer un routeur:
Par la désactivation de la méthode au niveau du routeur, votre api documentation de schéma sera correct.
Comment faire pour désactiver la méthode "DELETE" pour ViewSet dans DRF
P. S. Ce qui est plus fiable que de spécifier explicitement toutes les méthodes nécessaires, donc il ya moins de chance d'oublier quelques méthodes importantes OPTIONS, TÊTE, etc
P. P. S.
par défaut, la FONDATION a
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']