DjangoRestFramework - 注册用户:UserSerializer.save() 和 User.objects.create_user() 之间的区别?

DjangoRestFramework - registering a user: difference between UserSerializer.save() and User.objects.create_user()?

假设我想注册一个用户(我正在使用位于 django.contrib.auth.models 中的用户模型)。假设这是我的 serializers.py:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

以下视图之间有什么区别,在创建用户时推荐使用哪个?

视图A:

def createUser(request):
    if request.method == 'POST':
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

视图 B:

def createUser(request):
    serializer = UserSerializer(data=request.DATA)
    if serializer.is_valid():
        user = User.objects.create_user(
            email = serializer.init_data['email'],
            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)

两者都不完美。但是 视图 A 看起来很有希望。

  • 视图 A 是一个好的开始,但它是不完整的 解决方案。因为 User 创建 而不是 只是 User.save,而是你必须调用 User.create_user 方法。
  • 视图 B 是通过调用 User.create_user 创建用户的正确方法,但是,视图包含一个 逻辑,实际上应该是 抽象Serializer.save() 方法中。

要解决这个问题,您必须更改 Serializer.save() 方法的行为。查看 documentationSerializer.save(),将调用 Serializer.create()Serializer.update()

总而言之,我们必须覆盖 Serializer.create() 来创建用户并使用View A.

# File: serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def create(self, validated_data):
        user = User.objects.create_user(
            email = validated_data['email'],
            username = validated_data['username'],
            password = validated_data['password'],
        )
        return user