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 вы в конечном итоге придете к тому, что вы хотите, чтобы определенные пользователи выполняли действия только на определенных объектах, без необходимости микроуправления каждым запросом. Разрешения уровня объекта могут быть очень полезны здесь.