Django Rest framework-использование подробного маршрута и списка деталей

в моем коде у меня есть набор представлений для пользователя. Я хочу разрешить только операции чтения (/пользователи/42 и /пользователи/), который ReadOnlyModelViewSet делает просто отлично.

кроме того, я хочу иметь /пользователи/Регистрация URL, который я могу в должности to для регистрации нового пользователя.

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @list_route(methods=['post'])
    def register(request):
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            user = User.objects.create_user(
                username = serializer.init_data['username'],
                password = serializer.init_data['password'],
            )

            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

пара вопросов:

  • это правильно делать это?

  • есть подпись для метода, если я положил его в list_route или detail_route декоратор? потому что в примерах detail_route его всегда одна и та же подпись для метода: имя_метода(self, request, pk=нет):

спасибо!

1 ответов


ваш код почти правильный, вам просто не хватает правильной подписи на методе регистрации:

def register(self, request):

это правильная подпись в соответствии с документация. Кроме того,тесты предположим, что невозможно передать дополнительный параметр для маршрутизации, и что pk всегда будет передаваться для @detail_route, так что вам придется:

@detail_route
def register(self, request, pk=None):

для подробных маршрутов и

@list_route
def register(self, request):

список для маршруты.

однако я бы предложил вам воспользоваться встроенным ViewSetMixins как ModelViewSet делает внутренне:

from rest_framework import exceptions, mixins
class UserViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    def create(self, request):
        serializer = UserSerializer(data=request.DATA)
            if serializer.is_valid():
                user = User.objects.create_user(
                    username = serializer.init_data['username'],
                    password = serializer.init_data['password'],
                )

                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

для регистрации пользователей в целом вы также можете взглянуть на django-Регистрация-restframework, который я в настоящее время делает работу для моего проекта.

лично я полагаюсь на ModelViewSet в своих проектах и убеждаюсь, что только правильно авторизованные пользователи могут выполнять определенные действия. Для этого вы можете использовать модель широкая разрешения или в сочетании с Джанго-хранитель разрешения для конкретных объектов.

особенно с REST API вы в конечном итоге придете к тому, что вы хотите, чтобы определенные пользователи выполняли действия только на определенных объектах, без необходимости микроуправления каждым запросом. Разрешения уровня объекта могут быть очень полезны здесь.