我正在尝试创建一个用于创建新用户的端点。如果我在序列化程序中放入一个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()
答案 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