我们可以在 APIView(django rest framework) 中使用 serializer_class 属性吗?

har*_*per 9 python django django-views django-rest-framework

根据 DRF 文档,使用 GenericAPIView 时应设置 serializer_class 属性。但是为什么 serializer_class 属性甚至可以与 APIView 一起使用?这是我的 API 代码:

class UserView(APIView):

    serializer_class = SignupSerializer

    @transaction.atomic
    def post(self, request):
        email = get_data_param(request, 'email', None)
        password = get_data_param(request, 'password', None)

        params = request.POST.copy()
        params["username"] = email

        serializer = UserSerializer(data=params)
        if serializer.is_valid(raise_exception=True):
            user = serializer.save()
            user.set_password(password)
            user.save()
            params["user"] = user.id

        serializer = CustomProfileSerializer(data=params)
        if serializer.is_valid(raise_exception=True):
            profile = serializer.save()
            return Response(response_json(True, profile.to_dict(), None))

class SignupSerializer(serializers.Serializer):
    email = serializers.EmailField(max_length=100)
    password = serializers.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中浏览此 API 时,它确实将电子邮件和密码字段显示为输入,但如果我不设置此 serializer_class 属性,则不会显示任何输入字段。理想情况下,此 serializer_class 属性不应与 APIView 一起使用。我已经搜索了很多,但没有与此相关的可用内容。

任何人都可以解释这种行为吗?谢谢。

小智 3

我想这可以帮助你。
创建serializer.py并写入:

from rest_framework import serializers

from .models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('email', 'password')
Run Code Online (Sandbox Code Playgroud)

和views.py:

from rest_framework.response import Response
from rest_framework.views import APIView

from .serializers import UserSerializer
from .models import User


class AddUserAPIView(APIView):
    def post(self, request):
        user_serializer = UserSerializer(data=request.data)
        if user_serializer.is_valid():
            user = user_serializer.save() 
            user.set_password(user_serializer.data["password"])
            return Response({'message': 'user added successfully!'})

        return Response({'message': user_serializer.errors})
Run Code Online (Sandbox Code Playgroud)