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)
UpdateModelMixin
. Если вы хотите использовать обновление, но не патч, я сейчас могу думать о двух способах. Вы можете либо переопределить разрешенные методы в представлении и удалить «патч», либо переопределитьpartial_update
метод и вызовhttp_method_not_allowed(request, *args, **kwargs)
. Я не тестировал это, поэтому я не уверен, работает ли этоclass SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Вы можете продолжать использовать
viewsets.ModelViewSet
и определятьhttp_method_names
в своем ViewSet.пример
После того, как вы добавите
http_method_names
, вы больше не сможете делатьput
иpatch
.Если хочешь,
put
но не хочешьpatch
, можешь оставитьhttp_method_names = ['get', 'post', 'head', 'put']
Внутренне представления DRF происходят от Django CBV. Django CBV имеет атрибут http_method_names. Таким образом, вы также можете использовать http_method_names с представлениями DRF.
[Shameless Plug]: Если этот ответ был полезен, вам понравится моя серия сообщений о DRF на https://www.agiliq.com/blog/2019/04/drf-polls/ .
источник
python3
иDjango 1.10
отлично.mixins.UpdateModelMixin
Хотя для этой публикации прошло некоторое время, я внезапно обнаружил, что на самом деле это способ отключить эту функцию, вы можете редактировать его напрямую в views.py.
Источник: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
источник
Если вы пытаетесь отключить метод PUT в представлении DRF, вы можете создать собственный маршрутизатор:
Отключив метод на маршрутизаторе, ваша документация по схеме API будет правильной.
источник
Как отключить метод "DELETE" для ViewSet в DRF
PS Это более надежно, чем явное указание всех необходимых методов, поэтому меньше шансов забыть некоторые важные методы OPTIONS, HEAD и т. Д.
PPS по умолчанию DRF имеет
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
источник
super
на уровне класса, нетself
.В Django Rest Framework 3.xx вы можете просто включить каждый метод, для которого хотите включить
ModelViewSet
, передав словарь вas_view
метод. В этом словаре ключ должен содержать тип запроса (GET, POST, DELETE и т. Д.), А значение должно содержать соответствующее имя метода (список, получение, обновление и т. Д.). Например, предположим, что вы хотитеSample
создать или прочитать модель, но не хотите ее изменять. Так что это означает , что вы хотитеlist
,retrieve
иcreate
метод будет включить (и вы хотите , чтобы другие были отключены.)Все, что вам нужно сделать, это добавить такие пути
urlpatterns
:Как вы можете видеть, в приведенных выше настройках маршрутизации нет запроса
delete
иput
, поэтому, например, если вы отправляетеput
запрос на URL-адрес, он отвечает вам 405Method Not Allowed
:источник
Если вы планируете отключить методы размещения / публикации / уничтожения, вы можете использовать
источник