Django休息框架 - 使用序列化器创建方法或api perform_create进行帐户注册

时间:2016-06-05 15:46:35

标签: django django-rest-framework

我正在尝试创建一个用于创建新用户的端点。如果我在序列化程序中放入一个create方法,还是会在我的ApiView上调用perform_create吗?似乎仍在调用User.objects.create,因为如果我在序列化程序中传递'confirm-password',我会收到错误:

  

在致电TypeError时获得User.objects.create()。这可能是因为序列化程序类上的可写字段不是User.objects.create()的有效参数。您可能需要将该字段设置为只读,或重写UserSerializer.create()方法以正确处理此字段。   原始异常文本是:'confirm_password'是此函数的无效关键字参数。

为什么在串行器创建方法中使用.create_user()时会调用User.objects.create()?这也导致is_active默认为true,即使我在序列化程序中将其设置为false。

class UserCreateSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=False)
    confirm_password = serializers.CharField(write_only=True, required=False)

    class Meta:
        model = get_user_model()
        fields = ('id', 'email', 'username',
              'first_name', 'last_name', 'password',
              )
        read_only_fields = ('date_joined')

    def validate_email(self, value):

        if value and User.objects.filter(email=value).count():
            raise serializers.ValidationError(u'Email addresses is already registered.')
        return value

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


class UserCreateApiView(generics.CreateAPIView):
    serializer_class = UserSerializer
    permission_classes = [AllowAny,]
    queryset = get_user_model().objects.all()

1 个答案:

答案 0 :(得分:0)

根据文档,User.objects.create_user()始终会导致is_active为真的用户。

  

create_user(username, email=None, password=None, **extra_fields)

     

创建,保存并返回用户。

     

用户名和密码设置为给定。域的部分   电子邮件自动转换为小写,并返回用户   object将is_active设置为True。

     

如果未提供密码,将调用set_unusable_password()。

     

extra_fields关键字参数传递给用户   __init__方法允许在自定义用户模型上设置任意字段。

这是一个可行的解决方法:

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

    user.is_active = False
    user.save()
    return user