Django REST Framework: как сделать APIView/Serializer браузерным?

Использование serializers.HyperlinkedModelSerializer с viewsets.ModelViewSet прекрасно работает для CRUD, как описано в docs. К сожалению, для этого требуется 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())
]

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

Пробовали ли вы использовать атрибут класса serializer_class?

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

    def post(self, request: Request, *args, **kwargs):
        ...

Поле 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')
]
Вернуться на верх