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

时间:2015-05-06 19:37:07

标签: django django-views django-rest-framework user-registration

假设我想注册一个用户(我使用位于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)

1 个答案:

答案 0 :(得分:5)

这些都不是完美的。但查看A 看起来很有希望。

  • 查看A 是一个良好的开端,但它是不完整解决方案。由于User创建只是User.save,而是您必须调用User.create_user方法。
  • 查看B是通过调用User.create_user来创建用户的正确方法,但是,这些视图包含逻辑,其实际上应该是抽象在{{ 1}}方法。

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

总之,我们必须覆盖 Serializer.update()来创建用户,并使用查看A

Serializer.create()