Отключить метод в наборе представлений, django-rest-framework
ViewSets есть автоматические методы для перечисления, извлечения, создания, обновления, удаления,...
Я хотел бы отключить некоторые из них, и решение, которое я придумал, вероятно, не очень хорошее, так как OPTIONS по-прежнему утверждает, что это разрешено.
любые идеи о том, как сделать это правильно?
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)
3 ответов:
определение
ModelViewSet- это:class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet)так что вместо расширения
ModelViewSet, почему бы просто не использовать что вам нужно? Так например:from rest_framework import viewsets, mixins class SampleViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): ...при таком подходе маршрутизатор должен генерировать маршруты только для включенных методов.
ссылка:
вы могли бы продолжать использовать
viewsets.ModelViewSetи определитьhttp_method_namesв вашем наборе представлений.пример
class SampleViewSet(viewsets.ModelViewSet): queryset = api_models.Sample.objects.all() serializer_class = api_serializers.SampleSerializer http_method_names = ['get', 'post', 'head']как только вы добавите
http_method_names, вы не сможете сделатьputи
Если вы пытаетесь отключить метод PUT из набора представлений DRF, вы можете создать пользовательский маршрутизатор:
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отключив метод на маршрутизаторе, ваша документация по схеме api будет правильной.
Comments