Отключить метод в наборе представлений, 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)
626   3  

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):
    ...

при таком подходе маршрутизатор должен генерировать маршруты только для включенных методов.

ссылка:

ModelViewSet

вы могли бы продолжать использовать 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

    Ничего не найдено.