#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. Спасибо за ваш ответ, но, к сожалению, он не работает. Ошибки нет, но я не вижу гиперссылки для маршрута входа в систему. Есть идеи?