Фреймворк Django REST: как сделать просмотр/сериализатор APIView доступным для просмотра?

#django #django-models #django-rest-framework #django-views

Вопрос:

Использование serializers.HyperlinkedModelSerializer с viewsets.ModelViewSet отлично работает для CRUD, как описано в документах. К сожалению, для этого требуется Model , которого у меня нет в конечной точке входа.

Соответствующие фрагменты кода:

 # Serializer
class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField(min_length=8, max_length=50)

# View
class Login(APIView):
    permission_classes = [permissions.AllowAny]
    def post(self, request: Request, *args, **kwargs):
        # Some logic using LoginSerializer

# urls.py
urlpatterns = [
  path('v1/login', Login.as_view())
]
 

Есть идеи? Заранее спасибо!

Ответ №1:

Используйте serializer_class атрибут класса в GenericAPIView классе (или его подклассах)

 from rest_framework.generics import GenericAPIView


class Login(GenericAPIView):
    serializer_class = LoginSerializer
    permission_classes = [permissions.AllowAny]

    def get(self, request, *args, **kwargs):
        return Response({"detail": "HTTP GET Method"})

    def post(self, request, *args, **kwargs):
        return Response({"detail": "HTTP POST Method"}) 

Комментарии:

1. Я просто добавил это, но никакой разницы. Я даже не вижу маршрута v1/login , когда открываю http://localhost:8000/ . Как будто это даже не рассматривается. Может быть, связано с видом или urlpatterns ?

2. Я обновил ответ, теперь он должен работать

3. Спасибо за обновление вашего ответа, но, к сожалению, он не работает. login Маршрут не отображается в сгенерированных документах. Есть идеи?

Ответ №2:

url Поле serializers.HyperlinkedModelSerializer просто использует serializers.HyperlinkedIdentityField внутреннее. Таким образом, вы можете сделать следующее, чтобы получить тот же результат:

 # Serializer
class LoginSerializer(serializers.Serializer):
    url = serializers.HyperlinkedIdentityField(view_name='login', read_only=True)
    username = serializers.CharField()
    password = serializers.CharField(min_length=8, max_length=50)

# View
class Login(APIView):
    permission_classes = [permissions.AllowAny]
    def post(self, request: Request, *args, **kwargs):
        # Some logic using LoginSerializer

# urls.py
urlpatterns = [
  path('v1/login', Login.as_view(), name='login')
]
 

Комментарии:

1. Спасибо за ваш ответ, но, к сожалению, он не работает. Ошибки нет, но я не вижу гиперссылки для маршрута входа в систему. Есть идеи?